Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   аналог document.write для firefox (https://javascript.ru/forum/css-html-firefox-mizilla/38462-analog-document-write-dlya-firefox.html)

Owyn 02.06.2013 23:02

аналог document.write для firefox чтоб убрать все EventListener'ы
 
Т.К. 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

Цитата:

Сообщение от Owyn
П.С. - да мне надо полностью очистить страницу и потом показать на ней небольшую штуку клику на которую не должны мешать поп-апы и прочая дрянь.

<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

Цитата:

Сообщение от Deff (Сообщение 254170)

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

Deff 03.06.2013 01:08

Цитата:

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

Цитата:

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

Дайте ссылку на Демо пример

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

Вложений: 1
alert("test");

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

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

в лисе откройте его любым способом с установленным scriptish или 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

Цитата:

Сообщение от Deff (Сообщение 254202)
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

Цитата:

Сообщение от Owyn
а сам юзерскрипт зовется как раз после его вызово и устанавливать значение 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

Цитата:

Сообщение от Owyn
И как это программно засунуть в страницу из юзерскрипта то?

:D Вот была подобная темка => http://javascript.ru/forum/misc/3841...tml#post254030

Owyn 03.06.2013 13:26

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

Deff 03.06.2013 13:27

Цитата:

Сообщение от Owyn
Не В смысле перенаправлять же юзеров на отдельный сайт где текущий сайт будет опять

Хм, а чем это хуже чем заставлять установить юзер скрипт?
Тут просто дать ссылку

Owyn 03.06.2013 13:32

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

Deff 03.06.2013 13:37

Цитата:

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

Ну вот такой долгий диалог, дабы выяснить все требования...
Даже не все ... а лишь часть...

На оффсайте 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

Вложений: 1
Уже нашел кто херил финты :) Хоть я 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

Цитата:

Сообщение от Owyn
Через 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 не работает теперь совсем, думаю она всё равно никому не пригодится :) Надеюсь...


Часовой пояс GMT +3, время: 16:30.