Невозможно получить доступ к функции, встроенной в JavaScript - PullRequest
2 голосов
/ 30 октября 2010

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

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

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

1 Ответ

0 голосов
/ 30 октября 2010

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

(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"}})().

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

РЕДАКТИРОВАТЬ: Используйте обработчик onsubmit, если вам нужно сделать копию формы, и вы можете сделать этоскопируйте с помощью метода DOM cloneNode, открыв новое всплывающее окно с помощью target = "_ blank":

(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, но, надеюсь, этого достаточно, чтобы начать работу.

...