2013-07-02 43 views
8

Tôi có một WebView trên ứng dụng của mình và tôi không thể thay đổi các loại liên kết tệp html ("target = _blank"). Nhưng một số liên kết trên trang làm cho ứng dụng của tôi mở chúng trên trình duyệt hệ thống. Làm thế nào tôi có thể không cho phép hành động này?Làm thế nào tôi có thể không cho phép WebView mở các liên kết trên trình duyệt trong WinRT (target = _blank links)?

Cảm ơn.

Trả lời

9

Trong xử lý sự kiện NavigationCompleted chạy kịch bản này:

webView.InvokeScriptAsync("eval", new[] 
      { 
       @"(function() 
       { 
        var hyperlinks = document.getElementsByTagName('a'); 
        for(var i = 0; i < hyperlinks.length; i++) 
        { 
         if(hyperlinks[i].getAttribute('target') != null) 
         { 
          hyperlinks[i].setAttribute('target', '_self'); 
         } 
        } 
       })()" 
      }); 
+0

Hoạt động như một sự quyến rũ! Cảm ơn! –

+0

Xin chào! Great buddy! cảm ơn nó đã hoạt động. chỉ cần thêm chờ đợi keywork trước khi webView và làm cho sự kiện async, nó làm việc hoàn hảo. –

1

Có sự kiện bắt đầu điều hướng. Nó có thuộc tính hủy có thể được sử dụng để hủy điều hướng. Có lẽ điều này sẽ làm việc cho bạn?

http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.navigationstarting

+0

Sự kiện này chỉ khả dụng cho Xem trước Windows 8.1. – adheus

+0

Xin lỗi về điều đó. Tôi đã xem xét điều khiển WebView ngay bây giờ và không thể thấy bất kỳ móc nối nào. Có lẽ bạn có thể làm điều gì đó hacky? Bạn chỉ muốn vô hiệu hóa các liên kết? Có thể tải trang web trong iframe và có một số javascript sẽ vô hiệu hóa tất cả các liên kết. Lặp lại các điểm yếu trên trang và đặt onclicks của họ để trả về false. WebView có phương thức InvokeScript này nhưng có vẻ như chỉ để gọi một hàm hiện có trên trang và bạn không thể tiêm bất kỳ mã nào. Nên thẳng về phía trước mặc dù để xây dựng một số html và sử dụng phương thức NavigateToString – user1985513

+1

Sự kiện bắt đầu chỉ được gọi khi bạn đang điều hướng bên trong WebView. Bất kỳ liên kết nào yêu cầu một cửa sổ mới sẽ không được thông báo, AFAIK –

0

Nếu bạn chỉ muốn hiển thị trang và không cho phép bất kỳ hành động được thực hiện trên trang đó tôi sẽ nhìn vào WebViewBrush. WebViewBrush về cơ bản sẽ chụp màn hình trang web và người dùng sẽ không thể sử dụng bất kỳ liên kết nào hoặc bất kỳ liên kết nào khác trên trang đó, nó sẽ trở thành trang chỉ đọc. Tôi tin rằng đây là những gì bạn đang yêu cầu.

Thông tin thêm về WebViewBrush có thể được tìm thấy ở đây: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewbrush

+0

Không, người dùng có thể điều hướng trên trang web theo ý muốn.Vấn đề là trang web có một số liên kết để mở trên tab khác và điều đó khiến ứng dụng gọi trình duyệt. Tôi cần phải dừng nó từ gọi trình duyệt mà không thay đổi html. – adheus

0

Nếu bạn có thể chỉnh sửa mã HTML của trang và NavigateToString(), sau đó thêm < cơ sở target = '_ blank'/> vào đầu < >

+0

Sau khi thử nghiệm giải pháp này, tôi đã thấy rằng đôi khi bạn cũng vô hiệu hóa CSS và các tệp bên ngoài phải được xử lý với nội dung web chính. –

6

Trên Windows 10, bạn có thể sử dụng WebView.NewWindowRequested:

private void WebView1_NewWindowRequested(
    WebView sender, 
    WebViewNewWindowRequestedEventArgs args) 
{ 
    Debug.WriteLine(args.Uri); 
    args.Handled = true; // Prevent the browser from being launched. 
} 
1

Tình cờ gặp vấn đề này gần đây và tôi muốn thêm rằng mặc dù câu trả lời là user2269867's có thể không hoạt động trong một số trường hợp nhất định.

Ví dụ: trình duyệt hệ thống sẽ không chỉ mở nếu người dùng nhấp vào liên kết có thuộc tính target = "_ blank", mà còn nếu hàm window.open() được gọi trong javascript. Hơn nữa, ngay cả việc loại bỏ tất cả các thuộc tính 'đích' sẽ không hoạt động nếu một trang tải một số nội dung động và thay đổi DOM sau khi tập lệnh của bạn đã được thực thi xong.

Để giải quyết tất cả các vấn đề ở trên, bạn cần phải ghi đè chức năng window.open và cũng kiểm tra thuộc tính 'target' không một lần, nhưng mỗi khi người dùng nhấp vào một cái gì đó. Đây là tập lệnh bao gồm các trường hợp đó:

function selfOrParentHasAttribute(e, attributeName) { 
    var el = e.srcElement || e.target; 

    if (el.hasAttribute(attributeName)) { 
     return el; 
    } 
    else { 
     while (el = el.parentNode) { 
      if (el.hasAttribute(attributeName)) { 
       return el; 
      } 
     } 
    } 

    return false; 
} 

var targetAttributeName = "target"; 

document.addEventListener("click", function (e) { 
    var el = selfOrParentHasAttribute(e, targetAttributeName); 

    if (el) { 
     if ((el.getAttribute(targetAttributeName) == "_blank") || 
      (el.getAttribute(targetAttributeName) == "_new")) 
     { 
      el.removeAttribute(targetAttributeName); 
     } 
} 
}); 


window.open = function() { 
    return function (url) { 
     window.location.href = url; 
    }; 
}(window.open); 

Kỹ năng js của tôi không lý tưởng, vì vậy vui lòng sửa đổi. Cũng đừng quên rằng, như kiewic mentioned, đối với Windows 10 có sự kiện WebView.NewWindowRequested giải quyết vấn đề này tự nhiên hơn.