2012-11-14 17 views
5

Voglio usare window.open per aprire una finestra su uno dei miei file JSP. Ma il browser continua a mostrare connecting... E perfino il firebug smette di funzionare ogni volta che clicco il testo. Né i p né i input tag funzionano, ma quando uso un href per collegare il JSP si può collegare al file:javascript window.open non funziona

<!DOCTYPE html> 
<html> 
<head><title>Sample JSP Page</title> 
<script> 
function open(){ 
    //window.open("hello.jsp","hello","height=700, width=800"); 
    var x=window.open("hello.jsp","window","status=1,height=700, width=800"); 
    x.focus(); 
} 
</script> 
</head> 
<body> 
<h1>Sample JSP Page</h1> 
<p onclick="open()">do not work</p> 
<form> 
<input type="button" value="new window" onclick="window.open('test-with-utils')"></form> 
</body> 
</html> 
+2

Potrebbe voler rinominare la funzione open() come nello stesso scope di window.open() – Neps

risposta

10

Questo perché si è ridefinito window.open al momento della definizione della funzione aperta. Utilizzare invece un nome di funzione differente.

+0

Molto intelligente! Ho passato un po 'di tempo con un problema simile. Grazie! – rigon

+0

Salvavita. Mi sono imbattuto in questo: P –

6

Modificare il nome della funzione.

5

L'oggetto window è l'oggetto di livello superiore in JavaScript, e contiene in sé molti altri oggetti, come "documento", "storia", ecc

Quando si definisce una variabile o una funzione della propria voi aggiungere davvero una nuova proprietà all'oggetto della finestra. E questo sarà il lavoro (e un po 'dal vivo example):

var foo = "bar"; 
alert (window.foo); // says "bar" 

Inoltre se si aggiunge questo piccolo frammento di codice:

window.onerror = function (msg, url, num) { 
    alert ("Error: " + msg + "\nURL: " + url + "\nLine: " + num); 
    return true; 
}; 

si otterrà questo errore, quando si preme il pulsante:

Ciò significa una ricorsione senza fine. È un effetto collaterale: si definisce una nuova funzione di apertura e quando si chiama window.open(), si chiama ricorsivamente la propria funzione.

+0

+1 buona spiegazione – prageeth

1

Solo per ampliare la ragione per cui si riscontrano problemi qui, si consiglia di leggere un po 'di javascript Scope (Very Helpful Blog). In sostanza, si consideri il seguente codice:

<script> 
var thisOne=true; 
function thatOne() { 
alert("whizbang"); 
} 
var theOther={foo:"bar"}; 

//More code here... 
</script> 

Una volta raggiunto il commento, sai che puoi accedere a tali variabili e la funzione direttamente, come if (thisOne) {...}, element.onclick=thatOne; o console.log(theOther.foo). Tuttavia, è anche possibile accedervi come figli dell'oggetto root che, in un browser Web, è chiamato window. Così si può fare:

console.log(window["thisOne"]); 
window.thatOne.call(obj, params); 
console.log(window.foo.bar); 

così definendo open() come una funzione che non è all'interno di un altro elemento (vale a dire, è all'interno dell'elemento root), si sovrascrive la funzione window.open(). Quando si tenta di chiamare la funzione in seguito, si verificano problemi perché la funzione di apertura chiama window.open, che chiama window.open, che chiama window.open ...

Ci sono alcuni modi per aggirare questo -

definire la linea gestore onclick

a tale scopo, sbarazzarsi di tutta la <script>..</script> elemento quindi, utilizzando a seconda di quale elemento si sceglie (che supporta) aggiungere l'attributo onclick:

onclick="window.open('hello.jsp','window','status=1,height=700, width=800');" 

Questo è un metodo bello e veloce, e mantiene tutta la logica proprio lì con il suo elemento di attivazione, ma non è facilmente estendibile e potresti trovarti derisa da qualcuno.("Oh, si utilizza linea javascript? Come caratteristico")

cambio il nome del metodo

Questo avrà il minimo sforzo da voi in termini di ottenere la tua pagina di lavoro ora da quello che hai (è anche essenzialmente ciò che tutti gli altri hanno suggerito). Basta cambiare il nome del metodo aperto in qualcosa come openANewWindow() o gotoJSP() o qualsiasi cosa che non esiste già nell'oggetto root, assicurandosi di ottenere entrambi dove lo si definisce (nell'elemento script) e dove si usa (negli attributi onclick).

Utilizzare una chiusura

Questo è quasi sicuramente non ciò che si desidera in questo caso, la sua maggiore complessità del necessario per una singola funzione. Semplicemente includendo questo come esempio di come uscire dall'oggetto radice, vedere come essere in esso sembra essere il cuore del tuo problema.

Probabilmente hai già visto in javascript come definire un oggetto, ma potresti non sapere che definendo un oggetto, tutto ciò che stai facendo è aggiungere una proprietà dell'oggetto all'oggetto root. Puoi usare questo comportamento a tuo vantaggio, per dare una struttura gerarchica alle tue funzioni.

Ad esempio:

<script> 
var MyFunctions = (function() { 
    function open(){ 
    var x=window.open("hello.jsp","window","status=1,height=700, width=800"); 
    x.focus(); 
    } 
    return {open:open}; 
})(); 
</script> 

questo modo si crea una funzione anonima che viene eseguito immediatamente. All'interno dello scopo di questa funzione, viene definita un'altra funzione, open(), tuttavia è definita nell'ambito di tale funzione anonima, non dell'oggetto root (finestra). Dopo che è stato definito open(), un riferimento ad esso viene restituito come valore della proprietà dell'oggetto: open.

Il risultato di tutto questo è che la proprietà open dell'oggetto MyFunctions è la funzione necessaria. Puoi quindi chiamarlo con MyFunctions.open() o anche window.MyFunctions.open().