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
Код:
<!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:
красиво
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
Код:
<!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
Вон что. Спасибо.
Да, пробел был в конце. Отрезал его нафиг.
отсыпал
Новая тема
Ответить
Эта страница в полной версии