Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Контекстное меню IE - "выдёргивание" код Добавлено: 28.03.07 15:16  

Автор вопроса:  Сергей
Прошу прощения, если эта тема уже обсуждалась, киньте мне ссылки, и я сразу же успокоюсь :-).

Я прописал свой пункт в контекстном меню IE, и при нажатии на этот пункт IE вызывает прописанную в реестре страничку со скриптом (те, кто знает, о чём говорю, поймут). Текст скрипта приведён ниже:

<script type="text/javascript" language="JavaScript1.2">

   var parentwin = external.menuArguments;
   var doc = parentwin.document;
   var sel = doc.selection;
   var rng = sel.createRange();
   var str = new String(rng.text);
   var iStr;
   var cURL=doc.URL;
   var cCode=doc.documentelEment.Innerhtml;
   var cHTML=doc.body.Innerhtml;


   var C = new ActiveXObject ("MnPWS.Options");
   iStr=C.DefaultFind (str, cURL, cHTML);

</script>


Так вот, что касается выделенного фрагмента, и URL страницы, то это работает просто замечательно, однако ни cCode, ни cHtml - у меня загвоздка. И скорее всего, дело не в регистре... Пробовал разворачивать объект поступенчато - тоже не канает.

Возможно, что таким образом код страницы "выдернуть" не получится. Тогда предложите, пожалуйста, другой способ. У меня уже голова закипает...

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 28.03.07 20:28
   var cCode=doc.documentelEment.Innerhtml;
   var cHTML=doc.body.Innerhtml;
хех, ну если просто страница - ок, а если фрейм? :)

Ответить

Номер ответа: 2
Автор ответа:
 Сергей



Вопросов: 4
Ответов: 15
 Профиль | | #2 Добавлено: 29.03.07 03:08
Проблема в том, что не работает даже на простенькой html-странице. Да и там, где решается эта задача, фреймы исключены...

Если выводишь полученную переменную в alert();, пишет "undefended". Короче, "на нет и суда нет". :-). Только мне не смешно. Наверное, нужно сначала создать регион (range), как это делается с выделенным фрагментом. Но то, что я предполагаю, не более, чем гадание на кофейной гуще.

Как понимаю, это вопрос к специалистам по DOM, если не ошибаюсь. Мне бы просто ткнули пальцем (ссылкой), где именно можно ознакомится с решением данной проблемы, пусть без кода, пусть обще, но чтобы было понятно. От MSDN голова кругом - ресурс хорош, когда ищешь ответ на конкретный вопрос. А мой вопрос больше походит на метания по поводу смысла жизни :-).

Буду очень благодарен за помощь.

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 29.03.07 15:18
Ну тогда скорее всего косяк в самом начале

var parentwin = external.menuArguments;
var doc = parentwin.document;

потому что дальше точно правельно. Без справочника COM модель IE я непомню, буду дома гляну...

Ответить

Номер ответа: 4
Автор ответа:
 Сергей



Вопросов: 4
Ответов: 15
 Профиль | | #4 Добавлено: 30.03.07 13:49
Вряд ли в этих двух строчках ошибка, код практически без изменений взят из примера MSDN: http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/reference/ifaces/idochostuihandler/idochostuihandler.asp

А если код правилен, почему же он не работает? Ну, в смысле, тот, что взят из примера - как раз работает, к нему претензий никаких, а вот innerhtml никак не канает, хотя доступ к document у меня железно существует. Есть во всём этом какая-то иезуитская загвоздка...

Ответить

Номер ответа: 5
Автор ответа:
 Сергей



Вопросов: 4
Ответов: 15
 Профиль | | #5 Добавлено: 02.04.07 12:36
Ладно, ответ отыскал сам с очень толковой подсказки одного опытного товарища (огромное ему спасибо)... Оставляю сей фолиант, дабы у сказки был счастливый конец :-).

Как я понял, innerHTML в IE6 напрямую работать не желает по соображениям безопасности. Или просто глюки MSIE, что для опытного люда не является новостью. А теперь - сам код:

   var parentwin = external.menuArguments;
   var doc = parentwin.document;
   if (doc.body.hasChildNodes())
   {
      var children = doc.body.childNodes;
      for (var i = 0; i < children.length; i++)
      {
         A = A + ' ' + doc.all.item(i).innerHTML;
      };
    };


Мне порекомендовали прибегнуть к childNodes (http://developer.mozilla.org/en/docs/DOM:element.childNodes).

Идея довольно-таки неплохая, но "в лоб" не попёрла, видимо, из-за особенностей IE, ибо виделись далеко не все nodeName, а подавляющее большинство nodeValue возвращали null.

Пришлось вспомнить про тег all, и забить на соответствие требованиям W3C. В итоге all.item(i).innerHTML был поставлен на службу и прекрасно с поставленной задачей справился.

Так почему я подумал, что прямую работу innerhtml рабработчики IE6 забанили? А дело в том, что полученную переменную A средствами FSO не записать! Я бился два дня, но так и не нашёл той загадочной причины, что мешала записать полученный результат в файл. Однако, стандартными средствами VB файл лекго записался.

Что из этого следует? А то, что мудилы из MS попытались таким образом заблокировать сохранение исходного кода страницы посредством скриптов. Известно, что FSO - это единственная библиотека, благодаря которой скрипты могут работать с файлами.

Занавес, апплодисменты!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам