2013-07-02 7 views

risposta

9

Nel gestore di eventi NavigationCompleted eseguire questo script:

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

Funziona come un incantesimo! Grazie! –

+0

Ehi! Grande amico! grazie ha funzionato appena aggiunto, attendo il lavoro chiave prima di webView e rendendo l'evento asincrono, ha funzionato perfettamente. –

1

C'è un evento di inizio della navigazione. Ha una proprietà cancel che può essere utilizzata per annullare la navigazione. Forse funzionerà per te?

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

+0

Questo evento è disponibile solo per l'anteprima di Windows 8.1. – adheus

+0

Mi dispiace per quello. Ho guardato il controllo WebView proprio ora e non potevo vedere nessun hook. Forse potresti fare qualcosa di hacky? Vuoi solo disabilitare i collegamenti? Forse può caricare la pagina web in un iframe e avere qualche javascript che disabilita tutti i link. Passa in rassegna gli achors nella pagina e imposta i loro onclicks per restituire false. Il WebView ha questo metodo InvokeScript ma sembra che sia solo per invocare una funzione esistente nella pagina e non si può semplicemente iniettare alcun codice. Dovrebbe essere diretto, tuttavia, per creare alcuni html e utilizzare il metodo NavigateToString – user1985513

+1

L'evento di avvio viene chiamato solo quando si naviga all'interno di WebView. Qualsiasi collegamento che richiede una nuova finestra non verrà notificato, AFAIK –

0

Se si desidera solo per mostrare la pagina e non permettere alcuna azione da compiere su quella pagina vorrei guardare in WebViewBrush. Il WebViewBrush fondamentalmente screenshot il sito Web e gli utenti non saranno in grado di utilizzare alcun link o qualsiasi altra cosa su quella pagina, si trasformerà in una pagina di sola lettura. Credo che questo sia quello che stai chiedendo.

Maggiori informazioni WebViewBrush può essere trovato qui: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewbrush

+0

No, l'utente può navigare sul sito come desidera.Il problema è che il sito ha alcuni link da aprire su un'altra scheda, e questo fa sì che l'app chiami il browser. Devo impedirmi di chiamare il browser senza modificare l'html. – adheus

0

Se è possibile modificare codice HTML della pagina e NavigateToString(), quindi aggiungere < base target = '_ blank'/> nella testa < >

+0

Dopo aver provato questa soluzione, ho visto che a volte disabiliti anche i file CSS e esterni che devono essere elaborati con il contenuto web principale. –

6

In Windows 10, è possibile utilizzare WebView.NewWindowRequested:

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

imbattuti in questo stesso recentemente, e voglio aggiungere che anche se user2269867's risposta è una soluzione praticabile, potrebbe non funzionare in determinate situazioni.

Ad esempio, il browser di sistema non si apre solo se l'utente fa clic su un collegamento con l'attributo target = "_ blank", ma anche se la funzione window.open() viene chiamata in javascript. Inoltre, anche la rimozione di tutti gli attributi 'target' non funzionerà se una pagina caricherà alcuni contenuti in modo dinamico e modificando DOM dopo che lo script è già stato completato.

Per risolvere tutti i problemi precedenti, è necessario eseguire l'override della funzione window.open e anche controllare l'attributo 'target' non una volta, ma ogni volta che l'utente fa clic su qualcosa. Ecco lo script che copre questi casi:

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); 

Le mie competenze js non sono l'ideale, quindi sentitevi liberi di modificare. Inoltre, non dimenticare che, come kiewic mentioned, per Windows 10 c'è l'evento WebView.NewWindowRequested che risolve questo problema in modo più naturale.