$ .getJSON просто не работает для меня - PullRequest
1 голос
/ 15 сентября 2011

Я читал во многих местах, что добавление &callback=? к URL в $ .getJSON позволит междоменную выборку JSON. (например, см .: http://www.ibm.com/developerworks/library/wa-aj-jsonp1/) Но это просто не работает для меня.

Вот моя форма:

    <form id="commentForm_pub4101" class="commentForm" action="/SubmitComment" method="POST">
    <h3>Your comment:</h3>

        <div class="commentFormTopData commentFormRow">
            <label for="Commenter">your name</label>

            <input class="commentFormCommenter" id="Commenter" name="Commenter" type="text" value="" />
            <label for="Email">e-mail</label>
            <input class="commentFormEmail" id="Email" name="Email" type="text" value="" />
        </div>

        <div class="commentFormBody commentFormRow">
            <label for="Body">comment</label>
            <textarea class="commentFormBody" cols="20" id="Body" name="Body" rows="2"></textarea>
        </div>
    </form>

Вот мой JQuery:

$('form[action$="SubmitComment"]').submit(function (event) {
    event.preventDefault();
    $.getJSON('http://localhost/Comments/index.asp?Title=TESTTitle&Commenter=TESTCommenter&Email=TESTemail&Body=TESTBody&PublicationId=TESTPublicationId&callback=?',
            function (data2) {
                alert(data2.Title);
            }
        );
});

Целевой URL-адрес - это классический ASP-сценарий (не спрашивайте, почему - это сложно), использующий библиотеку JSON_2.0.4.asp для возврата результата JSON. Я не думаю, что это связано с проблемой, потому что вот возвращенный результат прямого вызова браузера по URL:

{"Commenter":"TESTCommenter","Email":"TESTemail","Body":"TESTBody","PublicationId":"TESTPublicationId","Title":"TESTTitle"}

Но если вы настаиваете, вот код (это тест на данный момент):

<!--#include file="JSON_2.0.4.asp"-->
<%
Dim body: body = Request("")
Dim jsa: Set jsa = jsObject()
jsa("Commenter") = Request("Commenter")
jsa("Email") = Request("Email")
jsa("Body") = Request("Body")
jsa("PublicationId") = Request("PublicationId")
jsa("Title") = Request("Title")
jsa.Flush
%>      

... Так что, когда я соберу весь этот тестовый код вместе ... нет любви. Нет окна с предупреждением «TESTTitle».

Что я делаю не так?

Ответы [ 5 ]

3 голосов
/ 15 сентября 2011

Для создания кросс-донинского JSON используется формат JSONP .

Когда ответ JSON выглядит следующим образом:

{"name":"value"}

выглядит соответствующий ответ JSONPнапример:

callBackName({"name":"value"})

Где callBackName - это обратный вызов, который вы отправляете в строке запроса.

Итак, ваш ASP-код должен подобрать этот параметр и обернуть JSONв вызове функции.

1 голос
/ 15 сентября 2011

Я видел похожую проблему, вызванную выходом jQuery из ?, прежде чем понять, что это должен быть вызов JSONP.

Решением было использование альтернативного набора параметров:

$.getJSON('http://localhost/Comments/index.asp?json.wrf=?', {
    Title: 'TESTTitle',
    Commenter: 'TESTCommenter',
    Email: 'TESTemail',
    Body: 'TESTBody',
    PublicationId: 'TESTPublicationId'
});
1 голос
/ 15 сентября 2011

callback=? будет заменено на что-то вроде callback=jQuery1238123883.Ваша ASP страница отвечает за получение этого значения обратного вызова.Затем оберните возвращаемый JSON в функцию с таким именем обратного вызова, если и только если установлен обратный вызов.

1 голос
/ 15 сентября 2011

JSONP нужна оболочка обратного вызова.См. http://en.wikipedia.org/wiki/JSONP

например, example.com?foo.php?callback=bar

возвращает

bar({json});
0 голосов
/ 15 сентября 2011

Попробуйте это:

$.getJSON('http://localhost/Comments/index.asp?Title=TESTTitle&Commenter=TESTCommenter&Email=TESTemail&Body=TESTBody&PublicationId=TESTPublicationId&callback=?',null,
        function (data2) {
            alert(data2.Title);
        }
    );
...