$ jQuery .ajax (), $ .post передающие “ОПЦИИ” как REQUEST_METHOD в Firefox

Продолжать, что сказал Dave Ward :

  • Вы не можете установить свойство Visible ко лжи, потому что управление не будет представлено.
  • необходимо использовать свойство Style для установки, это дисплей к ни один .
<час>

дизайн

<asp:Label runat="server" ID="Label1" Style="display: none;" />

<asp:Button runat="server" ID="Button1" />
Страницы/Управления <час>

Код позади

Где-нибудь в разделе загрузки:

Label label1 = (Label)FindControl("Label1");
((Label)FindControl("Button1")).OnClientClick = "ToggleVisibility('" + label1.ClientID + "')";
<час>

файл

function ToggleVisibility(elementID)
{
    var element = document.getElementByID(elementID);

    if (element.style.display = 'none')
    {
        element.style.display = 'inherit';
    }
    else
    {
        element.style.display = 'none';
    }
}
JavaScript <час>

, Конечно, если Вы не хотите переключаться, но только показывать кнопку/маркировку тогда, корректирует метод JavaScript соответственно.

важный момент здесь - то, что необходимо отправить информацию о ClientID из управления, которым Вы хотите управлять на стороне клиента в файл JavaScript, или устанавливающий глобальные переменные или через параметр функции как в моем примере.

329
задан VisioN 22 January 2013 в 04:00
поделиться

9 ответов

The reason for the error is the same origin policy. It only allows you to do XMLHTTPRequests to your own domain. See if you can use a JSONP callback instead:

$.getJSON( 'http://<url>/api.php?callback=?', function ( data ) { alert ( data ); } );
168
ответ дан 23 November 2019 в 00:48
поделиться

Можете ли вы попробовать это без

contentType: application / x-www-form-urlencoded

0
ответ дан 23 November 2019 в 00:48
поделиться

Мне кажется, что если o.url = 'index.php' и этот файл существует, это нормально, и в консоли возвращается сообщение об успешном выполнении. Он возвращает ошибку, если я использую url: http://www.google.com

Если я выполняю почтовый запрос, почему бы не использовать напрямую метод $. Post :

$.post("test.php", { func: "getNameAndTime" },
    function(data){
        alert(data.name); // John
        console.log(data.time); //  2pm
    }, "json");

Это все намного проще.

2
ответ дан 23 November 2019 в 00:48
поделиться

Попробуйте добавить параметр:

dataType: "json"

0
ответ дан 23 November 2019 в 00:48
поделиться

Я просматривал исходный код 1.3.2, при использовании JSONP запрос выполняется путем динамического построения элемента SCRIPT, который проходит мимо политики одного домена браузеров. Естественно, вы не можете сделать POST-запрос с помощью элемента SCRIPT, браузер получит результат с помощью GET.

Когда вы запрашиваете вызов JSONP, элемент SCRIPT не создается, потому что он делает это только тогда, когда Тип вызова AJAX установлен на GET.

http://dev.jquery.com/ticket/4690

4
ответ дан 23 November 2019 в 00:48
поделиться

В этой статье центра разработчиков Mozilla описаны различные сценарии междоменных запросов. В статье указывается, что запрос POST с типом содержимого «application / x-www-form-urlencoded» должен быть отправлен как «простой запрос» (без запроса OPTIONS «предварительной проверки»). Однако я обнаружил, что Firefox отправил запрос OPTIONS, хотя мой POST был отправлен с этим типом содержимого.

Мне удалось выполнить эту работу, создав на сервере обработчик запроса опций, который установил заголовок ответа Access-Control-Allow-Origin на «*». Вы можете ввести более строгие ограничения, задав для него что-то конкретное, например « http://someurl.com ». Кроме того, я прочитал, что, предположительно, вы можете указать список нескольких источников, разделенных запятыми, но я не мог заставить это работать.

Как только Firefox получает ответ на запрос OPTIONS с приемлемым значением «Access-Control-Allow-Origin», он отправляет запрос POST.

16
ответ дан 23 November 2019 в 00:48
поделиться

У меня была похожая проблема при попытке использовать Facebook API.

Единственный contentType, который не отправлял запрос Preflighted, был только text/plain... а не остальные параметры, упомянутые в mozilla здесь

  • Почему это единственный браузер, который так делает?
  • Почему Facebook не знает и не принимает запрос Preflighted?

FYI: Вышеупомянутый Moz doc предполагает, что заголовки X-Lori должны вызывать запрос Preflighted... это не так.

0
ответ дан 23 November 2019 в 00:48
поделиться

Другой способ обойти проблему - использовать прокси-скрипт. Этот метод описан для примера здесь

1
ответ дан 23 November 2019 в 00:48
поделиться

Я использовал следующий код на стороне Django, чтобы интерпретировать запрос OPTIONS и установить требуемые заголовки Access-Control. После этого мои междоменные запросы из Firefox начали работать. Как было сказано ранее, браузер сначала отправляет запрос OPTIONS, а затем сразу после этого POST / GET

def send_data(request):
    if request.method == "OPTIONS": 
        response = HttpResponse()
        response['Access-Control-Allow-Origin'] = '*'
        response['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
        response['Access-Control-Max-Age'] = 1000
        # note that '*' is not valid for Access-Control-Allow-Headers
        response['Access-Control-Allow-Headers'] = 'origin, x-csrftoken, content-type, accept'
        return response
    if request.method == "POST":
        # ... 

Edit: похоже, что по крайней мере в некоторых случаях вам также необходимо добавить те же заголовки Access-Control к фактическому ответу. . Это может немного сбивать с толку, поскольку запрос кажется успешным, но Firefox не передает содержимое ответа в Javascript.

56
ответ дан 23 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: