Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: JavaScript функция c document.write
цитата
20/08/15 в 10:38
 Nikso
На странице генерится яваскрипт где объявляется функция в результате работы которой вывод строка через document.write()
и далее вызов этой функции
При каждой загрузке страницы имя функции разное.
Внимание, знатоки, вопрос:
Как мне результат этой функции присвоить моей переменной.

рандомный код
<script>
function random_name() {document.write('some');}
random_name();
</script>

я хочу иметь, что-то типа
var my_var = 'some';
цитата
20/08/15 в 11:34
 freeek
Цитата:
'some'
это что такое?

если есть доступ к генерирующему скрипту, поменять на

Код:

<script>
var my_var = 'some';
</script>
цитата
20/08/15 в 11:50
 S_Flash
Nikso писал:
При каждой загрузке страницы имя функции разное.

Тут не совсем понятно, как имя функции в приведённом примере может деклирироваться рендомно?

Если тебе нужне результат того, что пишет в документ функция и ты можешь влезть в JS код самой функции, то ты бы и сам сделал верно?

Тогда рассматриваем фариант, когда влезть в код функции нельзя..
Код:

<div id="random_name">
<script>
function random_name() {document.write('some');}
random_name();
</script>
</div>

<script>
var my_var = document.getElementById('random_name').innerText;
</script>
цитата
20/08/15 в 12:07
 freeek
trollface.png
Код:


<!doctype html>
<script>
    function random_name() {
        document.write('some');
    }
    random_name();
</script>
<script id="self">
    ;(function (window) {
        var self = document.getElementById("self");
        if (self !== void 0 && self.nodeName.toString().toLowerCase() === "script") {
            var all = document.getElementsByTagName("SCRIPT"), i, prev, current, text, exp;
            for(i in all){
                current = all[i];
                if(!!current.id && current.id === "self"){
                    prev = all[i - 1];
                    text = prev.innerText || prev.textContent;
                    exp = /document\.write\((\W)([^\)]+)\1\)/i.exec(text);
                    if(!!exp && !!exp[2]){
                        window.my_var = exp[2];
                    }                   
                    break;
                }
            }
        }
    })(window);
</script>
<script>
   
    alert(my_var);
   
</script>

цитата
20/08/15 в 12:44
 ivango
freeek: красиво icon_smile.gif

P.S. но вряд-ли сработает...
цитата
20/08/15 в 12:52
 freeek
да понятно дело, исходных данных мало, плюс эта рандом функция пишет в дерево сразу.

just for fan, хотел дернуть текст 'some'. так то дергает, разве что в древних браузерах отпадет, без оптимизации, на коленке)
цитата
20/08/15 в 13:38
 Nikso
На выводимый скрипт повлиять не могу, он где-то в глубинах пхп генерируется. В тексте 'some' ссылка на флвшку, мне вот ее надо выцарпать и засунуть в плейер. Потому что
Код:
<param name="flashvars" value="file=<script>function random_name()...</script>&image=/" />

Не работает.

Если этот урл как-то ранее выдернуть в переменную и сделать так
Код:
<script>document.write('<param name="flashvars" value="file='+my_var+'&image=/" />');

то порядок
цитата
20/08/15 в 13:54
 S_Flash
Nikso:
Я же дал решение выше.
Оберни вывод функции в невидимый див
Код:
<div id="random_name" style="display:none"><script>random_name();</script></div>

получи её вывод
Код:
<script>
var my_var = document.getElementById('random_name').innerText;
</script>

и замени везде на странице random_name(); на my_var
цитата
20/08/15 в 14:11
 Nikso
S_Flash: извиняюсь, промотнул что-то до большой бороды freeek:'a )

идею понял, попробовал, но чето my_var у меня Undefined получается
цитата
20/08/15 в 14:47
 freeek
trollface.png trollface.png trollface.png icon_lol.gif
Код:


<!doctype html>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script>
    writeBuckup = document.write;
    document.write = function () {
    };
</script>
<script>
    function random_name() {
        document.write('/content/dir/some.flv');
    }
    random_name();
</script>
<script id="self">
    document.write = writeBuckup;
    my_var = (function (window) {
        var self = document.getElementById("self");
        if (self !== void 0 && self.nodeName.toString().toLowerCase() === "script") {
            var all = document.getElementsByTagName("SCRIPT"), i, prev, current, text, exp;
            var htmlList = [];
            for (i in all) {
                current = all[i];
                typeof current === "object" && htmlList.push(current);
                if (!!current.id && current.id === "self") {
                    prev = htmlList[htmlList.length - 2];
                    if (isNaN(-[1, ])) {
                        text = prev.innerHTML;
                    } else {
                        text = prev.innerText || prev.textContent;
                    }
                    exp = /document\.write\((\W)([^\)]+)\1\)/i.exec(text);
                    if (!!exp && !!exp[2]) {
                        return exp[2];
                    }
                    break;
                }
            }
            return "";
        }
    })(window);
</script>
<script>
    document.write(my_var);
</script>




идея, глушим вывод до того момента как отработает генератор кода, после извлекаем ссылку)) но это харкор)) было интересно, получиться или нет))
цитата
20/08/15 в 14:56
 S_Flash
Nikso:
Да, я не кроссбраузерно делал пример. Вот так работает в последних браузерах:

Код:
<!DOCTYPE html>
<head>
</head>
<body>

<script>
function random_name() {document.write('some');}
</script>

<div id="random_name" style="display:none"><script>random_name();</script></div>

<script>
var my_var = document.getElementById('random_name').childNodes.item(1).textContent;
console.log(my_var);
alert(my_var);
</script>

</body>
</html>
цитата
20/08/15 в 15:07
 Nikso
S_Flash: Спасибо. поменял childNodes.item(1) на 2 и все вышло. Первый индекс выводил просто кусок яваскрипта.

freeek: хардкорщик ))
цитата
20/08/15 в 15:24
 S_Flash
Nikso писал:
поменял childNodes.item(1) на 2 и все вышло. Первый индекс выводил просто кусок яваскрипта.

Это у тебя если где-то пробел или перевод строки в коде. Если в одну строчку вывести, то должно работать при 1
Код:
<div id="random_name" style="display:none"><script>random_name();</script></div>

если так
Код:

<div id="random_name" style="display:none">
<script>random_name();</script>
</div>

или
Код:

<div id="random_name" style="display:none">    <script>random_name();</script></div>

то при item(2), как у тебя..
Пробел или перевод строки идёт за отдельную ноду, это добавляет лишний индекс.
цитата
20/08/15 в 18:12
 Nikso
Вон что. Спасибо. smail27.gif
Да, пробел был в конце. Отрезал его нафиг.
отсыпал


Эта страница в полной версии