Вход

Просмотр полной версии : аналог document.write для firefox


Owyn
02.06.2013, 23:02
Т.К. document.write в последней лисе (21) не работает Exception: The operation is insecure., есть ли альтернативы чтоб избавиться от всех неизвестных EventListener'ов?

var w = window.open("","_self");
w.document.write('<html><head></head><body>Dyn.</body></html>');
- тоже самое ругается ФФ и на document.open и после window.open, похоже совсем ФФ отключил этот функционал.

Document.write убирает их всех добавленных с помощью addEventListener, а в FireFox что делать?

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

Deff
02.06.2013, 23:23
П.С. - да мне надо полностью очистить страницу и потом показать на ней небольшую штуку клику на которую не должны мешать поп-апы и прочая дрянь.
<script type="text/javascript">
function winOpen(str) {
var msg = new String("");
msg = "<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\" /><link rel=\"stylesheet\" type=\"text/css\" href=\"http://forum.mybb.ru/style/"+BoardStyle+"/"+BoardStyle+".css\" /><title>Награды пользователя</title>"
msg+= "<style type=\"text/css\">html, body, #pun, #pun-main {background-image: none; margin: 2px 2px; width: 99%;}</style><body>"
msg+="<div id=\"pun\" class=\"punbb\"><div id=\"pun-main\" class=\"main\">"
msg+="<span style='color:red;font-size:22px'>"+str+"</span>";
msg+="</div></div></body></html>";
popup = window.open("", "", "height=300, width=700, top=500, left=500, scrollbars=1")
popup.document.write(msg)
popup.document.close()
return false
}
</script>
<input type="button" value="Открыть" onclick="winOpen('Привет!')">
Cкриншот http://s1.uploads.ru/rYZyv.png

Owyn
03.06.2013, 00:47
Cкриншот http://s1.uploads.ru/rYZyv.png

Интернет страница то текущая не очищена, просто новое окошечко открылось. Не надо нам поп-апов :)

Deff
03.06.2013, 01:08
Интернет страница то текущая не очищена, просто новое окошечко открылось. Не надо нам поп-апов

П.П.С - в хроме всё отлично работает и так и так, осталось накостылять лису ну или оставить сообщение для юзеров "сами виноваты, переходите на хром и всё заработает как надо"
Дайте ссылку на Демо пример

Owyn
03.06.2013, 01:29
На пример чего именно? Я в первом сообщении дал два примера кода которые отлично работают в хроме и выключены вроде как разработчиками в лисе
(Уточняю что код выполняется не на локальной странице file// и из под юзерскрипта)

1:

document.write('<html><head></head><body>Dyn.</body></html>');


2:
var w = window.open("","_self");
w.document.write('<html><head></head><body>Dyn.</body></html>');


Если надо, то вот сам юзерскрипт ещё не накостыленный для лисы: http://userscripts.org/scripts/show/166494
*автозаменить все @match на @include и if(i) на if(i!=null) и оно дойдёт до места где в FF функция document.write выпилена разработчиками*

Deff
03.06.2013, 01:34
Owyn,
Ничего не понял - что нужно нажать, чтобы увидеть эффект от

document.write() в Хроме
и трабл в Лисе ?'

Если трудно на сайте - можно минималистический код в песочне?

Owyn
03.06.2013, 02:28
alert("test");

Песочницу не нашел где тут... приложил пользовательский скрипт в архиве,

в хроме перетащите его на список расширений в:
chrome://extensions/

в лисе откройте его любым способом с установленным scriptish (https://addons.mozilla.org/en-US/firefox/addon/scriptish/) или GreaseMonkey (https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/) чтоб установить,


зайдите на javascript.ru и смотрите различия в двух браузерах (хотя я и так уже сказал что в одном фурычит в другом просто нет и нужно другое решение)

Deff
03.06.2013, 10:28
Owyn,
так - подойдёт ?
<script>
window.onload=function(){document.write('<html><head></head><body>Chrome ok. iz pod FF ne uvidite eto.</body></html>')};
document.write('</div></div></div></div><div id="plaintext" style="display:none">#1<plaintext>');
</script>

Owyn
03.06.2013, 11:54
Owyn,
так - подойдёт ?

Так даже window onload не зовётся т.к. юзерскрипт после него запускается

Deff
03.06.2013, 12:11
Вариант на странице http://premod.mybb.ru/pages/document_write
Скриншот http://s1.uploads.ru/FhCnt.png

Owyn
03.06.2013, 12:16
Ну так вы перед вызовом window.onload его устанавливаете вот он и зовется "в норме", а сам юзерскрипт зовется как раз после его вызово и устанавливать значение window.onload уже нет смысла

Deff
03.06.2013, 12:20
а сам юзерскрипт зовется как раз после его вызово и устанавливать значение window.onload уже нет смысла
Ну дык прям клещами условия задачи вытягивать!

Deff
03.06.2013, 12:23
Вот кнопа Очистить стр. http://premod.mybb.ru/pages/document_write
всё работает и в FF

Owyn
03.06.2013, 12:33
Теперь осталось обойти хвалёную защиту ФФ и запустить document.write не из под песочницы юзерскрипта (сделать такую кнопку и нажать её автоматически)

function inject(func) {
var source = func.toString();
var script = document.createElement('script');
// Put parenthesis after source so that it will be invoked.
script.innerHTML = "("+ source +")()";
document.body.appendChild(script);
}

function myf() {
alert("YES");
document.write('<html><head></head><body>TEST</body></html>');
}

inject(myf);
YES в ФФ не выскакивает даже и ошибок нигде никаких не хочет показывать, в Хроме опять всё работает.

Deff
03.06.2013, 12:43
Owyn,
А мож привязать к реальному событию ?
Наверняка действие с связано с пользователем ?

Owyn
03.06.2013, 12:49
Наверняка действие с связано с пользователем ?
Связано с открытием страницы на которой юзерскрипт и выполняется

Deff
03.06.2013, 12:57
Owyn,
Ни наю - у меня чиститься и программно
http://premod.mybb.ru/pages/document_write

Owyn
03.06.2013, 13:03
программно
И как это программно засунуть в страницу из юзерскрипта то?

Deff
03.06.2013, 13:07
И как это программно засунуть в страницу из юзерскрипта то?
:D Вот была подобная темка => http://javascript.ru/forum/misc/38411-problemy-s-onclick-2.html#post254030

Owyn
03.06.2013, 13:26
Не В смысле перенаправлять же юзеров на отдельный сайт где текущий сайт будет опять грузится, но только во фрейме? +_+

Deff
03.06.2013, 13:27
Не В смысле перенаправлять же юзеров на отдельный сайт где текущий сайт будет опять
Хм, а чем это хуже чем заставлять установить юзер скрипт?
Тут просто дать ссылку

Owyn
03.06.2013, 13:32
Кому дать ссылку? И когда? И, главное, на что ссылку дать? Я никого не заставляю. Пользователи для своего же удобства сами находят юзерскрипт и ставят его.

Deff
03.06.2013, 13:37
Кому дать ссылку? И когда? И, главное, на что ссылку дать? Я никого не заставляю. Пользователи для своего же удобства сами находят юзерскрипт и ставят его.
Ну вот такой долгий диалог, дабы выяснить все требования...
Даже не все ... а лишь часть...

На оффсайте FF выяснять не пробовали ?

Owyn
03.06.2013, 13:48
Задать вопрос разработчикам мозиллы почему они ограничили doc.write и как обойти их ограничение?...

Deff
03.06.2013, 13:52
Owyn,
Такой финт тож херицо ?

document.body.innerHTML='<img src="http://forum.mybb.ru/i/blank.gif" onload="document.write(\'<html><head></head><body>TEST</body></html>\');"/>'

Owyn
03.06.2013, 14:38
Уже нашел кто херил финты :) Хоть я noscript и всё время отключал на текующей страницы он всё равно наровил включиться обратно через некоторое время...

Рабочий код:
function inject(func) {
var source = func.toString();
var script = document.createElement('script');
script.innerHTML = "("+ source +")()";
document.body.appendChild(script);
}

function myf() {
//alert("OK");
document.write('<html><head></head><body>TEST</body></html>');
}

inject(myf);

Но осталась последняя проблема:

если в f оставить только алерт то всё ок, если там оставить document.write то таб в firefox бесконечно остается "Connecting..." и кружок всегда крутится вместо её иконки и img не грузятся (хотя если на них нажать reload то всё ок покажет их), в хроме опять всё хорошо работает...

Deff
03.06.2013, 14:40
тут недочёт
нун так:
script.text = "("+ source +")()";
///

Owyn
03.06.2013, 14:47
Замена innerHTML на text проблему не решила, + алерт выдаётся и так и так если его туда поставить, да и TEST пишется на страницу, но она продолжает грузиться и не даёт загрузиться ничему на ней..

Deff
03.06.2013, 14:54
Owyn,
А если так:
function inject(func) {
var img = document.createElement('img');
img.src = 'http://forum.mybb.ru/i/blank.gif' //Пиксельная прозрачка
img.setAttribute("onload","document.write('<!DOCTYPE><html><head></head><body>TEST</body></html>')";
//img.setAttribute("onload","("+func+")()"; //Пока в комменте
document.body.appendChild(img);
}

function myf() {
//alert("OK");
document.write('<html><head></head><body>TEST</body></html>');
}

inject(myf);
Поправлено в document.body.appendChild(img);

Owyn
03.06.2013, 15:07
Через img тоже самое грузит страницу бесконечно, хоть TEST и пишется так

Deff
03.06.2013, 15:17
Через img тоже самое грузит страницу бесконечно, хоть TEST и пишется так
нун какой нидь try - catch повесить на window.onload, который подключить после
document.write(

Deff
03.06.2013, 16:08
Возможно такой ход спасет?
function myf() {
setTimeout(function () {
//alert("OK");
document.write('<html><head></head><body>TEST</body></html>');
},20)
}
(*Думаю что может подгрузка юзерскрипта не завершена

Owyn
03.06.2013, 19:05
Так же грузится...
Но я нашел пока решение:
- Сделать вид что всё хорошо :) с помощью window.stop() и заполнеия документа содержанием (не с помощью document.write) через некоторое время после window.stop() с помощью setTimeout() - тогда хоть картинку показывать будет.

* Вот только кнопка F5 не работает теперь совсем, думаю она всё равно никому не пригодится :) Надеюсь...