变量未定义

时间:2011-11-08 19:49:12

标签: javascript jquery tipsy

我正在尝试使用此代码来更新tipsy插件的回退。 如何访问第一个函数之外的变量 a ?我可以覆盖变量来进行更新,对吗?

<script type="text/javascript">
$(document).ready(function () {
    var a ="Login";
    $("#login_form").submit(function () {
        var formdata = $("#login_form").serializeArray();
        $.ajax({
            url: "ajax_login.php",
            type: "post",
            dataType: "json",
            data: formdata,
            success: function (data) {
                if (data.livre === 'complete') {
                    var a ="success";
                } else 
                    var a = "Error";
            }
        });
return false;
    });
});
</script>

<script type='text/javascript'>
$(document).ready(function () {
    $('.login_fields input[rel=tipsy]').tipsy({gravity: 'w', trigger: 'manual', fallback: a }); // a is not defined
});
</script>

5 个答案:

答案 0 :(得分:3)

将第二个document.ready块中的代码移动到第一个(通过a调用可以访问.tipsy()变量)或将a变量设置为全局

<script type="text/javascript">
$(document).ready(function () {
    var a ="Login";
    $("#login_form").submit(function () {
        var formdata = $("#login_form").serializeArray();
        $.ajax({
            url: "ajax_login.php",
            type: "post",
            dataType: "json",
            data: formdata,
            success: function (data) {
                if (data.livre === 'complete') {
                    a ="success";
                } else 
                    a = "Error";
            }
        });
return false;
    });
    $('.login_fields input[rel=tipsy]').tipsy({gravity: 'w', trigger: 'manual', fallback: a });

});
</script>

OR

<script type="text/javascript">
var a = "Login";
$(document).ready(function () {
    $("#login_form").submit(function () {
        var formdata = $("#login_form").serializeArray();
        $.ajax({
            url: "ajax_login.php",
            type: "post",
            dataType: "json",
            data: formdata,
            success: function (data) {
                if (data.livre === 'complete') {
                    a ="success";
                } else 
                    a = "Error";
            }
        });
return false;
    });
});
</script>

<script type='text/javascript'>
$(document).ready(function () {
    $('.login_fields input[rel=tipsy]').tipsy({gravity: 'w', trigger: 'manual', fallback: a }); // a is not defined
});
</script>

注意我从AJAX调用的成功回调中删除了var声明。

<强>更新

要将更新后的a值传递给tipsy,您需要在回调函数中运行.tipsy()调用。您也可以像现在一样运行它并更新回调函数中的tipsy插件(但是我不熟悉插件并且不知道如何执行此操作):

<script type="text/javascript">
$(document).ready(function () {
    var a ="Login";
    $("#login_form").submit(function () {
        var formdata = $("#login_form").serializeArray();
        $.ajax({
            url: "ajax_login.php",
            type: "post",
            dataType: "json",
            data: formdata,
            success: function (data) {
                if (data.livre === 'complete') {
                    a ="success";
                } else {
                    a = "Error";
                }
                $('.login_fields input[rel=tipsy]').tipsy({gravity: 'w', trigger: 'manual', fallback: a });
            }
        });
return false;
    });
});
</script>

答案 1 :(得分:1)

在不创建tipsy plugin本身的情况下创建Tipsy对象后,无法更改它的fallback属性。

鉴于fallback参数是一个字符串,只要执行$().tipsy({...})函数就会对其进行解释。因此,之后更改变量a的值不会更改fallback参数。

我首先想到直接从fallback对象更新$.fn.tipsy.defaults属性就可以了,但是当创建一个新的Tipsy对象时,fallback属性基本上是复制在其中,因此它将永久存储fallback的初始值。

一种解决方案是分叉Tipsy项目并更改fallback属性以接受字符串或function()。像这样,可以执行以下操作:fallback: function (){ return a;}

答案 2 :(得分:0)

a变量移到就绪函数之外:

<script type="text/javascript">
    var a ="Login";
    $(document).ready(function () {

另外,请勿在成功函数中使用var关键字。您正在重新声明变量,而不是设置在ready函数开头定义的变量的值。

 success: function (data) {
            if (data.livre === 'complete') {
                a ="sucess";
            } else 
                a = "Error";
        }

答案 3 :(得分:0)

你可以把它变成全球性的。是否应该做什么取决于。

如果它已全部在doc中运行,则没有理由拥有全局;您可以从ajax成功运行第二个docready中的代码(如果满足您的需要,则完成)。

很难说;不知道这些片段与现实有多接近。

答案 4 :(得分:0)

1)为什么你有2个Document.ready ??

2)您可以使用全局参数或$ .data来传输数据。

3)对于你的解决方案 - 声明var a ="Login"; out side或使用self Executing func来保持全局变量的范围。