Safari отображает источник JavaScript вместо выполнения - PullRequest
3 голосов
/ 24 февраля 2010

У меня есть веб-приложение, в котором JavaScript разбросан по странице. То, что происходит, - то, что сафари сбросит источник кода javascript вместо того, чтобы выполнить его. Я могу воспроизвести это последовательно.

Страница представляет собой коллаж из различных форм контента:

загружает флэш-видео с помощью osflv и генерируется с помощью php-скрипта на стороне сервера. Кроме того, страница также содержит вызовы API Google Map для отображения карты. Содержимое размещается на отдельных вкладках с использованием JavaScript для обеспечения взаимодействия вкладок.

Я также использую mootools, и не уверен, что это может вызвать проблемы.

Вот javascript включает в себя:

<script type="text/javascript" src="/js/mootools-1.2.1-core.js"></script>
<script type="text/javascript" src="/js/mootools-1.2-more.js"></script>
<script type="text/javascript" src="/js/tiny_mce/tiny_mce.js"></script>
<script type="text/javascript" src="/js/sifr.js"></script>
<script type="text/javascript" src="/js/sifr-debug.js"></script>
<script type="text/javascript" src="/js/common.js"></script>
<script type="text/javascript" src="/js/alerts.js"></script>
<script type="text/javascript" src="/js/swfobject.js"></script>
<script type="text/javascript" src="/js/autocompleter.js"></script>
<script type="text/javascript" src="/js/observer.js"></script>
<script charset='ISO-8859-1' src='/js/rac.js' language='javascript'></script>

rac.js взят из osflv, common.js и alerts.js - это пользовательский код JavaScript, который включает в себя пользовательские классы и функции, используемые для отображения или манипулирования данными на странице.

Этот блок кода выполняется на странице просто отлично:

<script type="text/javascript">
        var whitney = { src: '/flash/whitney.swf'};
        sIFR.activate(whitney); 
        sIFR.replace(whitney, { selector: 'h6#propertyHeadline', wmode:'transparent',css: {'.sIFR-root': {'color': '#1ca9b9' }}});  
 </script>

Этот код также отлично работает:

<script language='javascript'>
  var src = '/player';
  if(!DetectFlashVer(9, 0, 0) && DetectFlashVer(8, 0, 0))
   src = 'player8';
  AC_FL_RunContent('codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0', 'width', 520, 'height', 440, 'src', src, 'pluginspage', 'http://www.macromedia.com/go/getflashplayer',    'id', 'flvPlayer', 'allowFullScreen', 'true', 'movie', src, 'FlashVars','movie=media/orig/4b845109d99d0.flv&fgcolor=0x1CA9B9&bgcolor=0x000000&autoload=off&volume=70');
</script>

Это последний фрагмент кода, который встроен в html в нижней части страницы до конца тега body. Safari будет случайным образом выплевывать код src в браузере в любой точке, кроме скрипта хороших карт, включая :

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=googlemapsapikeyblockedout" type="text/javascript"></script>
<script type="application/javascript">

    function InitPropertyDashboardTabs(){
        mytabs = new TabPanel('DashboardTabPanel');
                initializeGallery();
        initializeSiteplan();
        initializeMap('address blocked out');
        }

    var map = null;
    var geocoder = null;

    function initializeSiteplan()
    {
        var flashvars = {PropertyId:1,BasePath:'/',wmode:'transparent'};
        var params = {wmode: 'transparent'};
        var attributes = {id: 'SWFSitePlan',name: 'SWFSitePlan'};
        swfobject.embedSWF("/flash/FloorplanViewer/FloorplanViewer.swf", "SiteplanFlash", "915", "500", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
    }

    function initializeGallery()
    {
        var  params = {wmode: 'transparent'};..... (more code)

Это то, что страница с дампом js alt text
(источник: oxid8.com )

Вот как должна выглядеть страница: alt text
(источник: oxid.com. )

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Во-первых, вы не должны использовать атрибут language, он устарел .

Единственное, что я вижу, это то, что вы используете application/javascript вместо text/javascript в своем HTML (есть разница между тем, что вы указываете в своем HTML, и серверами типа MIME, которые используются при отправке файла Javascript), но Я не могу воспроизвести какие-либо ошибки в Chromium / Linux с помощью простого контрольного примера, например

<!DOCTYPE html>
<html>
  <head> 
    <title>dkdkd</title> 
  </head>
  <body> 
    <script type="application/javascript"> 
      var i=0;
    </script>
  </body>
</html>

(Возможно, вы тоже можете попробовать это.)

На всякий случай: правильно ли закрыт элемент скрипта? Является ли весь Javascript корректным, то есть он проходит JSLint ?

Возможно, вы можете вставить полный исходный код HTML-страницы (желательно на что-то вроде Pastebin ), чтобы мы могли ближе рассмотреть.

0 голосов
/ 25 февраля 2010

Полагаю, я попробую. У меня была похожая проблема на некоторых страницах, которые использовали TinyMCE (на странице отображался JavaScript или даже части моего HTML)

Моим решением было обновить версию TinyMCE, которую я использовал. v3.3 имеет переработанный обработчик Webkit.

Насколько я могу судить, проблема заключалась в том, что TinyMCE вставляла (плохо) дополнительные блоки javascript на страницу.

Это (и несколько похожих блоков) всегда вводится в

<script type="text/javasript" src="http://www.example.com/javascript/rte/langs/en.js" onload="tinemce.dom.ScriptLoader._onLoad(this,'http://www.example.com/javascript/rte/langs/en.js', 0);">

Который, когда сработал onload, вставил следующий блок в случайное место в DOM, искажая все, что было расположено поверх.

<script type="javascript" src="http://www.example.com/javascript/rte/langs/en.js">

Результатом этого, как видно из Инструментов разработчика Webkit, стало превращение

<td class="tab" nowrap="">

в

<td class="ta<script stype="text=""javascript"" src="http://www.example.com/javascript/rte/langs/en.js"> "b" nowrap=>"

Поскольку это явно недопустимая разметка, был получен полученный мусор.

Обновление моей установки TinyMCE с предыдущей стабильной версии до v3.3rc1 устранило проблему. TinyMCE Changelog ссылается на полный пересмотр Webkit.

редактировать: под случайным я действительно имею в виду случайное. Каждый раз он вставляет тег сценария в другое место, иногда нарушая содержимое, иногда нет.

...