Здравствуйте, помогите пожалуйста разобраться с этим Сафари, что ему не хватает? Есть тестовый скрипт, просто выводящий то, что он получил через POST. Одна из возможных задач - вывести js-галерею, к-рая опять же приходит через POST. И все казалось бы работает, за исключением одной пакости, Сафари ни под Виндой ни под Маком ничего не показывает, вообще, пустую страницу показывает, хотя код получает, при посмотре кода всё на месте. Если же скормить Сафари этот же самый HTML код, к-рый он не показывает, но сохраненный как html файл, то все нормально работает. Не хочет показывать только когда получает его от PHP. Это скрипт PHP: <!DOCTYPE html> <html> <head> <title>Preview</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Michroma|Terminal+Dosis+Light|Cabin+Sketch" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript" src="galleria/galleria-1.2.2.js"></script> </head> <body> <?php if ( isset( $_POST ) ) $postArray = &$_POST ; // 4.1.0 or later, use $_POST else $postArray = &$HTTP_POST_VARS ; // prior to 4.1.0, use HTTP_POST_VARS foreach ( $postArray as $sForm => $value ) { if ( get_magic_quotes_gpc() ) $postedValue = stripslashes( $value ); else $postedValue = $value ; echo $postedValue; } ?> </body> </html> Это результат работы скрипта HTML: <!DOCTYPE html> <html> <head> <title>Preview</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Michroma|Terminal+Dosis+Light|Cabin+Sketch" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript" src="galleria/galleria-1.2.2.js"></script> </head> <body> <div id="gallery"> </div> <script type="text/javascript"> var data = [ {image:"images/1.jpg",title:"",description:"",link:""}, {image:"images/3.jpg",title:"",description:"",link:""}, {image:"images/2.jpg",title:"",description:"",link:""} ]; Galleria.loadTheme("galleria/themes/twelve/galleria.twelve.min.js"); $("#gallery").galleria({width: 500,height: 300,data_source: data}); </script> </body> </html>
Если что-то не так с заголовками, то http://www.php.su/functions/?get_headers Попробуй запросить свой же скрипт и посмотришь заголовки сразу. Но мне что-то подсказывает, что тебе нужно сбросить кэш браузера
Кэш сбрасывал. Заголовки с Денвера, и с сервера в интернете: (Сафари не показывает результат ни оттуда ни оттуда) [css] From Denver Array ( [0] => HTTP/1.1 200 OK [1] => Date: Thu, 07 Apr 2011 13:18:34 GMT [2] => Server: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8k PHP/5.2.12 [3] => X-Powered-By: PHP/5.2.12 [4] => Content-Length: 657 [5] => Connection: close [6] => Content-Type: text/html; charset=windows-1251 ) From server Array ( [0] => HTTP/1.1 200 OK [1] => Date: Thu, 07 Apr 2011 13:22:05 GMT [2] => Server: Apache [3] => X-Powered-By: PHP/5.3.5 [4] => Connection: close [5] => Content-Type: text/html ) [/css] Проблема именно с отображением этого конкретного js-слайдера, именно в Сафари, и именно когда код приходит из PHP. P.S. Сейчас хочу еще прогнать POST запрос с другим js-кодом, может это связано или в общем с JS или конкретно с этой библиотекой. Такое впечатление что он не выполняет js скрипт, если он из PHP пришел.
Поменял галерею на другую, то же самое. Все браузеры показывают, Сафари не показывает. Делаю статическую HTML страницу с этой же jQuery галереей - показывает. Получается Сафари не выполняет Javascript если он пришел в коде PHP страницы? Упростил экперимент, передаю в POST запросе всего один элемент HTML: <script type="text/javascript">alert("Eto ja - JavaScript!");</script> Все браузеры алёрт показывают, но не Сафари. Т.е. факт налицо - Сафари не выполняет скрипты полученные из PHP. Только вот почему?
JavaScript включен. Вот этот php файл работает в Сафари следующим образом - первый скрипт, к-рый записан вручную в коде страницы, срабатывает, а второй такой же, к-рый приходит через POST и выводится с помощью echo $postedValue;, ни хрена не срабатывает, хотя в исходном коде полученной от сервера страницы он есть, его можно увидеть с помощью Вид>Просмотреть HTML код, и он не содержит синтаксических ошибок. Во всех других браузерах оба скрипта срабатывают. На Маке такое же поведение у Сафари. PHP: <!DOCTYPE html> <html> <head> <title>Preview</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> </head> <body> <script type="text/javascript">alert("Это скрипт внутри body.");</script> <?php if ( isset( $_POST ) ) $postArray = &$_POST ; // 4.1.0 or later, use $_POST else $postArray = &$HTTP_POST_VARS ; // prior to 4.1.0, use HTTP_POST_VARS foreach ( $postArray as $sForm => $value ) { if ( get_magic_quotes_gpc() ) $postedValue = stripslashes( $value ); else $postedValue = $value ; echo $postedValue; } ?> </body> </html> Пробовал менять echo на print, результат тот же самый.
Вот, до чего я дошел. Если вывести яваскрипт таким образом PHP: $testValue = '<script type="text/javascript">alert("Это скрипт из php.");</script>'; echo $testValue; // срабатывает он срабатывает в Сафари (в других браузерах само собой, с ними вообще проблем не было). Но если этот яваскрипт был получен через POST, Сафари как-то чувствует его, как-то отличает от других, и не выполняет. Хотя при просмотре кода страницы (в браузере) никакой разницы в скриптах нет, они идентичны, просто один выполняется, а другой нет. Как такое может быть? Что такого добавляет POST, что Сафари это видит, но для человека визуальной разницы нет?
Попытайтесь забудыть про POST. Для браузера нет разницы - для него есть только HTML. Смотрите на то, чем отличаются HTML-и. Внимательно смотрите. Пробелы, слеши... мало ли что. А как ты пост отправляешь?
POST отправляет код HTML-редактора, я просто метод вызываю для этого. Но я просматривал содержимое запроса, и ответ просматривал, все нормально. Сейчас еще хочу попробовать вручную простейший POST отправить в этот же скрипт и посмотреть разницу. Кстати, если сохранить в файл исходный код страницы из Сафари, дать ему расширение html, из в этом же Сафари запустить, то проблеммный js-код сработает. Это к вопросу что нет разницы, и главное HTML. Значит все таки есть разница.
Точно барабашки. Вот я упростил предельно, все лишнее выкинул. Посылаю из формы с одним полем HTML: <form action="preview-test.php" method="post"> <input type="text" name="firstname" style="width:300px;" value="" /> <input type="submit" value="Submit" /> </form> POST запрос в ниже приведенный PHP скрипт (HTML обертку я здесь опустил, она есть в постах выше в этой теме) PHP: <?php if ( isset( $_POST ) ) $postArray = &$_POST ; // 4.1.0 or later, use $_POST else $postArray = &$HTTP_POST_VARS ; // prior to 4.1.0, use HTTP_POST_VARS foreach ( $postArray as $sForm => $value ) { if ( get_magic_quotes_gpc() ) $postedValue = stripslashes( $value ); else $postedValue = $value ; echo $postedValue; } ?> в поле формы вписываю следующий текст: <script type="text/javascript">alert('Script from POST!');</script> и нажимаю Submit. POST запрос уходит, PHP обрабатывает и возвращает страницу. Все браузеры мне показывают алёрт - "Это скрипт из POST!", Сафари мне показывает красивую белую страницу и всё. Скрипт, к-рый пришел через POST, не выполняется. Вот такие барабашки живут в браузере Сафари. У кого есть Сафари попробуйте пожалуйста этот пример http://mutaborsoft.com/post.html, появится ли у вас алёрт при загрузке страницы-ответа. Это скопируйте в поле: <script type="text/javascript">alert('Script from POST!');</script>
alex-try попробуй отправлять также и заголовки header("Content-type: text/html"); по коду: зачем проверки на версию пхп ниже 4 ? например, у меня скрипт выводит сообщение о том, что требуется пхп 5 и умирает, если версия пхп меньше 5-ой. а ещё проверка get_magic_quotes_gpc() - обычно в самое начало скрипта включается проверка, которая автоматом исправляет $_GET, $_POST от лишних слешей при установленых магических кавычках.
Спасибо за поправки, я просто недавно с PHP работаю, еще не освоился, код этот я скопировал из примеров к CKEditor. Что касается проблемы, у меня есть еще такая версия что это зависит от версии Safari. Я проверял на 5.0.2 на винде, и 5.0.3 на маке.
Добил я его таки. Дело оказалось в версии Safari. После установки Safari 4-ой версии все заработало. Так что Safari 5 имеет такой вот неприятный баг.
Это снятие защиты от скриптов? Тогда я думаю это не решит проблему. Я уже убедился, что другие скрипты в этом же документе выполняются без проблем, как же защита может это допускать? Тогда они все не выполнялись бы. Хотя, когда обратно пятую версию установлю, попробую. А куда именно в начало добавить, так что-ли? HTML: header("X-XSS-Protection: 0"); <!DOCTYPE html> <html> ...
<?php header("X-XSS-Protection: 0"); ?> <!DOCTYPE html> ... Вот так Это защита от XSS. Браузер видит, что скрипт на странице совпадает с тем, что ушел от него через запрос и блокирует. Зашита реализована в вебките (сафари, хром), и вроде как в последнем ИЕ даже.
Иногда, чтобы обойтись без флагов и уменьшить размер первой страницы (вместе со скриптами), нужно заменять на лету один js на другой. Это нормально, имхо. Не вижу ничего плохого. В графике это выглядит, как если бы пользователь переключил режим фортепианного синтезатора. Т.е. органы управления те же, а звучит по новому.