2010-10-30 5 views
2

Я вводил следующий код непосредственно в адресную строку браузера. Если я отредактирую его немного (хотя и не изменив код) со вкладки HTML в Firebug, он будет работать. Этот фрагмент кода изменит событие onsubmit всех форм на странице, чтобы вызвать функцию, которая извлекает значения поля этой формы и отправляет ее как метод GET на другой URL. Является ли это политикой такого же происхождения, которая мешает мне это делать, или мой код действительно не так?Не удается получить доступ к javascript, введенной функции

Примечание: Извините за ужасное однострочное кодирование и неэффективный синтаксический анализ.

javascript:(function() { 
    document.getElementsByTagName('head').item(0).innerHTML += '<script>function scGD(i){i--;var value="form="+i;for(var j=0;j<document.forms[i].elements.length;j++){if(document.forms[i].elements[j].name!=""&&document.forms[i].elements[j].name!=null){value+="&"+document.forms[i].elements[j].name+"="+document.forms[i].elements[j].value;}}alert("Value is: "+value);window.open("./postvalidation.php?"+value);}</script>'; 
    var split2 = []; 
    var split3 = []; 
    var split1 = document.getElementsByTagName('body')[0].innerHTML.split("<form"); 
    for (var i = 1; i < split1.length; i++) { 
     split2[i - 1] = split1[i].split(">"); 
     split3[i - 1] = split2[i - 1][0].split("onSubmit=\"", 2); 
     if (split3[i - 1].length == 1) { 
      split3[i - 1] = split2[i - 1][0].split("onsubmit=\""); 
     } 
     if (split3[i - 1].length == 1) { 
      split3[i - 1] = split2[i - 1][0].split("ONSUBMIT=\""); 
     } 
     if (split3[i - 1].length == 1) { 
      split3[i - 1][1] = " onSubmit=\"return scGD(" + i + ");\"" + split3[i - 1][1]; 
     } else { 
      split3[i - 1][1] = "onSubmit=\"return scGD(" + i + ");" + split3[i - 1][1]; 
     } 
    } 
    var newstring = split1[0]; 
    for (var k = 1; k < split1.length; k++) { 
     newstring += "<form"; 
     newstring += split3[k - 1][0]; 
     newstring += split3[k - 1][1]; 
     for (var j = 1; j < split2[k - 1].length; j++) { 
      newstring += ">"; 
      newstring += split2[k - 1][j]; 
     } 
    } 
    document.getElementsByTagName('body')[0].innerHTML = newstring; 
})() 
+0

Я понимаю, что букмарклеты должны быть на одной строке, но можете ли вы отформатировать ее так, чтобы ее можно было читать? – Yahel

ответ

0

Если я правильно понимаю ваш вопрос, вы действительно только нужно изменить способ и действия атрибутов формы:

(function(){ 
    var f = document.forms; 
    for(var x = 0; x < f.length; x++) { 
     f[x].method = 'GET'; 
     f[x].action = 'http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi'; 
    } 
})() 

В одной строке, которая была бы javascript:(function(){var f=document.forms;for(var x=0;x<f.length;x++){f[x].method="GET";f[x].action="http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi"}})().

Представления формы: не, на которые распространяется политика одного и того же происхождения, поскольку они являются очень старой функцией браузеров. Удаление возможности отправки форм кросс-домена приведет к катастрофическому нарушению совместимости веб-сайтов.

EDIT: Используйте onsubmit обработчик, если вам нужно сделать копию формы, и вы можете сделать эту копию с использованием метода cloneNode DOM, открытие в новом всплывающем используя цель = «_ пустой»:

(function(){ 
    var f = document.forms; 
    for(var x = 0; x < f.length; x++) { 
     f[x].oldOnsubmit = f[x].onsubmit || function() { 
      return true; 
     }; 
     f[x].onsubmit = function() { 
      var clone = this.cloneNode(true); 
      if(this.oldOnsubmit.apply(this, arguments)) { 
       clone.method = 'GET'; 
       clone.action = 'http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi'; 
       clone.target = '_blank'; 
       clone.style.display = 'none'; 
       clone.onsubmit = null; 
       document.body.appendChild(clone); 
       clone.submit(); 
      } else { 
       return false; 
      } 
     }; 
    } 
})() 

Сжатый в форме букмарклет с использованием Closure Compiler, который был бы: javascript:(function(){for(var c=document.forms,b=0;b<c.length;b++){c[b].oldOnsubmit=c[b].onsubmit||function(){return true};c[b].onsubmit=function(){var a=this.cloneNode(true);if(this.oldOnsubmit.apply(this,arguments)){a.method="GET";a.action="http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi";a.target="_blank";a.style.display="none";a.onsubmit=null;document.body.appendChild(a);a.submit()}else return false}}})()

Он работает только в Internet Explorer, Firefox и Opera, но, надеюсь, что это достаточно хорошо, чтобы вы начали.

+0

Привет сообщества, Извините, что открыл старую банку червей, но кто-нибудь знает, как я буду это делать в Google Chrome? Позволит ли мне это сделать? – user491938