ajax函数和Grails控制器

时间:2016-01-02 19:09:52

标签: javascript jquery ajax grails

我只是在GSP中尝试ajax Jquery功能,这里是GSP:

<%@ page contentType="text/html;charset=UTF-8"%>
<html>
 <head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta name="layout" content="main" />
 <title>Insert title here</title>

<g:javascript library='jquery' plugin='jquery' />

<script type="text/javascript">
 function callAjax(){
$(document).ready(function(){
    $('button').click(function(){
var URL="${createLink(controller:'book',action:'checkJquery')}"
$.ajax({ 

        url:URL,

    data: {id:'1'},
        success: function(resp){
    console.log(resp);
    $("#author").val(resp.author)
    $("#book").val(resp.bookName)

    }
  });
});

 });
}


</script>

</head>
<body>
    <button class="testMe" onclick="callAjax();">test</button>
    <div class="body" id="divBody">

 <g:textField name="author" id="author"/>
<g:textField name="book" id="book"/>
    </div>
</body>
</html>

这是控制器中的 checkJquery 操作:

def checkJquery() {
    def s=Book.get(params.id)
    render s as JSON
    }

当我点击按钮时,它没有做任何事情的问题,但是如果我再次点击它会在Chrome控制台中打印下面的问题,为什么从第一次点击它没有工作,以及为什么要两次打印回复。

Object {class: "test.Book", id: 1, author: "a1", bookName: "book1"}
Object {class: "test.Book", id: 1, author: "a1", bookName: "book1"}

1 个答案:

答案 0 :(得分:6)

所以这里有几点要指出。

function callAjax(){
    $(document).ready(function(){
        $('button').click(function(){
            var URL="${createLink(controller:'book',action:'checkJquery')}";

            $.ajax({
                url:URL,
                data: {id:'1'},
                success: function(resp){
                    console.log(resp);
                    $("#author").val(resp.author);
                    $("#book").val(resp.bookName);
                }
            });
        });
    });
}

让我们从逻辑开始。所以这是创建一个包含文档就绪的函数。这意味着当函数执行它时会将函数提供给document ready方法,该方法将延迟执行它直到解析页面的主体并在dom中。

现在让我们看一下html。

<button class="testMe" onclick="callAjax();">test</button>

这是定义一个按钮,单击它时将调用callAjax()方法。所以让我们遵循逻辑。您创建将在稍后执行的功能。您的页面已呈现,按钮已存在。

单击执行该方法的按钮。然后,该方法为文档提供了准备好等待页面解析的功能。但是......我们已经知道了。因为您基于与页面的交互来调用它。所以准备好的文件毫无意义。

另一点是,每次点击该按钮都会发生这种呼叫。这意味着您的方法将多次发生,这意味着您的绑定将多次发生,依此类推。

您应该考虑使用javascript而不是内联绑定,以便将您的问题分开并最小化/消除冗余。

所以首先关闭html会改变为......

<button class="testMe">test</button>

和你的javascript ...

    $(document).ready(function(){
        $('.testMe').click(function(){
            var URL="${createLink(controller:'book',action:'checkJquery')}";

            $.ajax({
                url:URL,
                data: {id:'1'},
                success: function(resp){
                    console.log(resp);
                    $("#author").val(resp.author);
                    $("#book").val(resp.bookName);
                }
            });
        });
    });

现在你的标记只是你的标记,你的绑定会在页面加载后发生,而且只发生一次。