Как получить доступ к текстовому содержимому, полученному через <script type = "text/plain" src=...> в JavaScript?
При использовании <script type="text/plain" src="http://..."></script>
, где URL-адрес относится к текстовому файлу, есть ли способ доступа к содержимому файла в JavaScript? Файл переносится в браузер, но значение свойства innerHTML
элемента script
не изменяется (оно остается пустой строкой). Проверка элемента node в DOM, похоже, не обнаруживает какого-либо свойства, через которое можно было бы найти полученный контент.
Я знаю, что вместо этого можно использовать XMLHTTPRequest, но Im заинтересован в проблеме, почему браузеры извлекают данные так, как я описывал, но, похоже, не предлагают никакого доступа к ней.
Ответы
Ответ 1
Прежде всего, атрибут text
HTMLScriptElement
является предпочтительным способом доступа к тексту встроенного элемента <script>
. DOM-Level-2 и HTML5: 4.11.1 оба что script должен иметь атрибут text
, который содержит внутренний текст сценариев:
Атрибут IDL text
должен возвращать конкатенацию содержимого всех узлов Text, которые являются дочерними элементами элемента script
(игнорируя любые другие узлы, такие как комментарии или элементы), в древовидном порядке. При настройке он должен действовать так же, как атрибут textContent
IDL.
Так как элемент <script>
пуст (вы указали внешний источник), text
, textContent
и innerHTML
пусты. Это связано с тем, что атрибут text
установлен только в встроенных скриптах:
Если script является встроенным, а тип блока script - текстовым языком:
Значение атрибута text
IDL в момент последнего флажка элемента "уже началось" - это источник script.
Таким образом, невозможно использовать внешний text/plain
, используя этот метод.
См. также:
- W3C: HTML5: 4.11.1 Элемент script: текстовый атрибут и пример для карты игры:
<script src="game-engine.js"></script> <!-- game engine isn't inline -->
<script type="text/x-game-map"> <!-- but data needs to be inline -->
........U.........e
o............A....e
.....A.....AAA....e
.A..AAA...AAAAA...e
</script>
Ответ 2
Обратите внимание, что если бы это было подтверждено, это обеспечило бы огромную дыру в безопасности и средство для защиты от межсайтовых скриптовых защит, которые защищают json и другие данные. По сути, моя неприятная веб-страница (nasty.com, скажем) может получить доступ к вашим личным данным, защищенным куки файлами, загрузив ее с помощью тега script. например.
<script type="text/plain"
src="https://supersecure.com/youraccount/privatedocs/list"/>
Поскольку файлы cookie для supersecure.com будут автоматически отправляться с запросом (как это бывает при запросе любых ресурсов), защищенный сайт просто возвращает данные (например, список частных документов), поскольку он не мог легко сказать запрос отдельно от одного из запроса ajax с его законной веб-страницы. Это отверстие не существует с ajax, так как браузер просто запретит странице от nasty.com делать запрос ajax на supersecure.com, благодаря той же политике происхождения.
Очевидно, что нет проблем безопасности с встроенными данными.
Ответ 3
После нескольких дней исследования того же вопроса я нашел несколько ссылок на следующий код:
<html>
<head>
<script type="text/javascript">
function init(){
var extText = window.frames.messageTxt.document.body.lastChild.lastChild.data;
extText = extText.replace(/[\r\n]/g," ");
document.forms[0].nMessage.value = extText;
}
window.onload=init;
</script>
</head>
<body>
<iframe name='messageTxt' src='txtData.txt' style='display:none'></iframe>
<form>
<textarea name='nMessage'></textarea>
<input type="button" value="click" onClick="init()">
</form>
</body>
</html>
Приведенный выше код действительно получает доступ к файлу txtData.txt(при условии, что он существует) и выгружает его в <textarea>
в качестве текста по умолчанию. По какой-то причине ни один из вышеприведенных ответов не упоминает, что это работает, я полагаю, потому что вопрос, кажется, подразумевает тег <src>
специально (так как подобный метод может быть недоступен, я не проверял); тем не менее, я все же считаю, что стоит упомянуть, полагая, что ваш запрос содержит более общий вопрос о получении внешнего .txt файла (или если кто-то другой, кто сталкивается с этой страницей, ищет упомянутый вопрос anwser), в основном потому, что мне потребовалось несколько часов, чтобы исследовать его, поэтому я считаю правдоподобным, что ответ был просто затруднительным.
Ответ 4
Да, нет, я не думаю, что вы можете получить текстовое содержимое. Это главным образом потому, что вы собираетесь использовать элементы доступа к дому, чтобы получить текст, который никогда не вводился в самом домене.
Я попробовал несколько вариантов, и они не сработали. У меня нет веских причин, почему вы не сможете его найти, но причина, по которой я отказываюсь от этого, так это потому, что даже инспектор WebKit, который я использую, не имеет раскрытия треугольника рядом с тегом script -src. Что он делает, так это то, что он преобразует src в ссылку, на которую вы можете щелкнуть, а затем использует Ajax или что-то еще, чтобы прочитать этот текст с сервера.