Есть ли способ (в PHP) определить, был ли скрипт вызван загрузкой jQuery или нет?

Мне нужен скрипт, который мог бы определить, вызывается ли он jquery

Если нет, он будет отображать страницу + макет, если нет, то просто контент (но это не имеет значения)

Но да, способ определить, был ли он вызван загрузкой jquery - ajax - или напрямую запрошен.

Ваше здоровье!


person Tom    schedule 26.09.2009    source источник


Ответы (4)


Не могли бы вы отправить параметр GET с загрузкой?

Ie:

jquery=1 //(for load)

jquery=2 //(for the 'low-level' ajax call)

Любое другое значение для нормальной загрузки скрипта

Затем вы позволяете PHP-скрипту определить, что делать дальше. Читая значение $_GET['jquery']

person Waleed Amjad    schedule 26.09.2009
comment
Итак, если у меня есть скрипт, который говорит: $(#actualcontent).load($(this).attr(href)); как бы я добавил к этому дополнительную переменную/параметр GET? - person Tom; 27.09.2009
comment
$(#actualcontent).load($(this).attr(href)+'?jquery=1'); - person Waleed Amjad; 27.09.2009
comment
Если слишком ручной. jQuery уже отправляет что-то вместе с запросом, который вы можете использовать, не изменяя ни одной строки JS. - person ceejayoz; 27.09.2009
comment
Я также голосую за использование $_SERVER['HTTP_X_REQUESTED_WITH'], как и другой ответ. В конце концов, это именно то, для чего он существует — чтобы увидеть, был ли запрос от реализации Ajax. - person grantwparks; 27.09.2009
comment
Справедливо, но как отличить вызов jQuery load() от вызова jQuery ajax()? Как упоминалось в вопросе. - person Waleed Amjad; 27.09.2009
comment
Я не думаю, что вы читаете вопрос одинаково. Я не вижу необходимости различать ajax() и load() в вопросе. Вы читаете это как jQuery load, ajax или direct — я читаю это как jQuery load (то есть ajax) или direct. - person ceejayoz; 27.09.2009

Возможно, вы захотите взглянуть на заголовки HTTP, которые получает ваш сервер.

Например, давайте рассмотрим, что у меня есть эта страница:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js"></script>
</head>
<body>
    <div id="test"></div>
    <script type="text/javascript">
        $('#test').load('temp.php');
    </script>
</body>
</html>

А скрипт temp.php содержит только это:

<?php
var_dump($_SERVER);

die;


При выполнении load "тест" <div> будет содержать дамп $_SERVER ; и это будет включать это, среди прочего:

'HTTP_X_REQUESTED_WITH' => string 'XMLHttpRequest' (length=14)

XMLHttpRequest — это объект, который используется для выполнения запроса Ajax.


Это означает, что вы должны иметь возможность определить, был ли запрос сделан с помощью запроса AJax, примерно так:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
    && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    echo "Ajax";
} else {
    echo "Not Ajax";
}

При этом вы можете определить, вызывается ли ваша страница «обычно» или через запрос Ajax, и решить, должны ли вы включать макет или нет.


Кстати: именно это решение используется, например, Zend Framework для обнаруживать запросы Ajax.

person Pascal MARTIN    schedule 26.09.2009
comment
Первую строку можно упростить до if (@$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { - person Waleed Amjad; 27.09.2009
comment
@ Sbm007: мне действительно не нравится скрывать ошибки с помощью оператора @ и использовать его только тогда, когда это действительно необходимо - здесь я хочу проверить, присутствует ли эта запись в $_SERVER и соответствует ли ее значение тому, что я хочу, и это именно то, что делают isset и второе условие. - person Pascal MARTIN; 27.09.2009
comment
О, ладно, честно, я не знал об этом. Я думал, что это одно и то же. Спасибо. - person Waleed Amjad; 27.09.2009
comment
Нет необходимости ни в isset, ни в операторе @ — if($_SERVER['HTTP_X_REQUESTED_WITH']) { } вполне подойдет. Нет необходимости в дополнительном хламе. - person ceejayoz; 27.09.2009
comment
@Sbm007: нет проблем :-) ;; @ceejayoz: таким образом, когда ваш PHP-скрипт вызывается нормально (т. Е. Когда эта запись не существует в $_SERVER), вы получите уведомление: неопределенный индекс: HTTP_X_REQUESTED_WITH - и да, я всегда разрабатываю с активированными уведомлениями , и я призываю всех сделать то же самое в этом случае. - person Pascal MARTIN; 27.09.2009

Если я правильно помню, функции jQuery AJAX отправляют заголовок X-Requested-With (со значением XMLHttpRequest).

person ceejayoz    schedule 26.09.2009

если вы используете Zend Framework, вы можете использовать

// in one of your controllers
if ($this->getRequest()->isXmlHttpRequest()) {
  // ...
}

http://framework.zend.com/manual/en/zend.controller.request.html

person Svetoslav Marinov    schedule 28.11.2009