4

邪魔にならない Javascript を使用して、既存のリンクに対して追加の ajax クエリをトリガーしようとしています。

クエリはサーバーに送信されて処理され、テスト用に文字列 "javascript template ok" が返されます。

ただし、ajax の「成功」関数は呼び出されません。代わりに、トリガーされるのは「エラー」機能です...

Chrome デバッガーを調べたところ、サーバーから応答テキストが返されていることがわかりますが、「成功」メソッドが呼び出されることはありません... :-(

私の電話は

jQuery.ajax({
    type: 'POST',

    success: function(response) {   
        $("#details").html(response);
        console.log(response);
    },
    error: function(){ 
        alert("Error\nData could not be retrieve from the server");
    },
    url: '/treeview/show/1538.js',
    cache: false,
});

(この例では URL がハードコードされています)。ブラウザの同じ URL は、レイアウトなしで正しいデータを取得します :-)

URLの「.js」を削除すると、レイアウト付きのhtmlテンプレートが返され、「詳細」divの更新が正しく行われます...

コントローラーは

    respond_to do |format|
      format.html # show.html.erb
      format.js   { render :inline => "JAVASCRIPT TEMPLATE !" }
    end

ありがとうございました

編集 :

ajax クエリから返されるオブジェクトは次のとおりです (エラーの最初の引数: function(jqXHR) ):

Object
    abort: function ( statusText ) {
    always: function () {
    complete: function () {
    done: function () {
    error: function () {
    fail: function () {
    getAllResponseHeaders: function () {
    getResponseHeader: function ( key ) {
    overrideMimeType: function ( type ) {
    pipe: function ( /* fnDone, fnFail, fnProgress */ ) {
    progress: function () {
    promise: function ( obj ) {
    readyState: 4
    responseText: "JAVASCRIPT TEMPLATE !"
    setRequestHeader: function ( name, value ) {
    state: function () {
    status: 200
    statusCode: function ( map ) {
    statusText: "OK"
    success: function () {
    then: function ( /* fnDone, fnFail, fnProgress */ ) {
    __proto__: Object

だから私は正しい応答テキストを取得します??!! エラーはどこにありますか?:-s

4

6 に答える 6

9

dataTypeオプションを明示的に指定しないためjQuery.ajax、jQuery はそれを推測しますscript(Rails が提供する MIME タイプに依存します)。JAVASCRIPT TEMPLATE !は有効な Javascript ステートメントではないため、パーサー エラーがスローされます。successの代わりに呼び出されるコールバックを取得するには、次の 2 つのオプションがありますerror

次のように明示的に指定dataTypetextます。

jQuery.ajax({
    type: 'POST',
    dataType: 'text',
    // ...
});

または、コントローラーから有効な Javascript を返します。

respond_to do |format|
  format.html # show.html.erb
  format.js { render :inline => "{}" }
end
于 2013-03-11T20:52:06.723 に答える
1

応答が JavaScript コードとして評価される可能性があるため、キャッチされるエラーをスローする可能性があると考えましたか?

于 2013-03-11T14:00:37.627 に答える
0

これはあなたがすべきことです:

$.post('/treeview/show/1538.js', function(response, data){
  $("#details").html(data.responseText);
}).error(function(){
  alert("Error\nData could not be retrieve from the server");
})

コントローラのオプション

respond_to do |format|
  format.html # show.html.erb
  format.js   { render text: "JAVASCRIPT TEMPLATE !" }
end

それを試してみてください。

于 2013-03-16T15:31:50.197 に答える
0

さて、これについてはよくわかりませんが、おそらく次のいずれかが役立ちます。

エラー/成功の代わりにdone()andを使用します。fail()このような:

$.ajax({ ...}).done(...).fail(...);

また

成功/エラー コールバックで正しい関数引数を使用してみてください。おそらくjQueryは署名が好きではないので、関数を呼び出さないのでしょうか?

于 2013-03-10T19:10:54.623 に答える
0

あなたのajax呼び出しに、追加します

dataType: 'json',

そして、コントローラ

format.js   render :text => { :some_data => "JAVASCRIPT TEMPLATE !" }.to_json
于 2013-03-12T06:24:26.913 に答える
0

エラー コールを編集して、エラー データを DOM に渡します。

error: function(data){ console.log(data); }

次に、何が起こっているかを正確に確認します。

于 2013-03-15T17:46:33.107 に答える