2013-10-01 4 views
0

У меня есть два элемента select. Я попытался очистить свой старый код, сделав некоторые переменные глобальными.Не удается получить значение из глобальной переменной

прежде чем я успел что-то вроде этого:

var user = $('#my_SiteUsers').val(); 

Проблема в том, что теперь я мог получить только значение из этой переменной, в другое время я, возможно, потребуется что-то вроде innerHTML, и я предпочел бы не должны создайте для этого новую переменную.

Итак, я создал глобальную переменную, называемую пользователем.

начато с document.ready.Но теперь мой пользователь и группа переменных не дают мне значения, которые мне нужны. Например, предупреждения являются триггерами, поскольку опция по умолчанию не подбирается. Извините, если вопрос непонятен. Я могу опубликовать старый код, если это поможет.

$(document).ready(function(){ 
    user = $('#my_SiteUsers'); 
    group = $('#my_SiteGroups'); 
    groupsAssigned = $("#my_SPGroupsAssigned"); 
    groupAvailable = $("#my_SPGroupsAvailable"); 
    userAssigned = $("#my_SPUsersAssigned").html(""); 
    userAvailable = $("#my_SPUsersAvailable").html(""); 

    $("button").click(function() { return false; }); 

    populate(); 
}); 


function populate() { 
    //Populate the user list 
    strHTMLSiteUsers = ""; 
    $().SPServices({ 
     operation: "GetUserCollectionFromSite", 
     async: true, 
     completefunc: function(xData, Status) { 
     $(xData.responseXML).find("User").each(function() { 
      strHTMLSiteUsers += "<option value='" + $(this).attr("LoginName") + "'>" + $(this).attr("Name") + "</option>"; 
     }); 
     user.append(strHTMLSiteUsers); 
     } 
    }); 

    if (user.val() == "default"){ 
    //don't do anything 
    }else{ 
    //if a user is selected, run 
    RefreshGroupLists(); 
    } 

    //Populate the group list 
    strHTMLSiteGroups = ""; 
    $().SPServices({ 
     operation: "GetGroupCollectionFromSite", 
     async: true, 
     completefunc: function(xData, Status) { 
     $(xData.responseXML).find("Group").each(function() { 
     strHTMLSiteGroups += "<option value='" + $(this).attr("Name") + "'>" + $(this).attr("Name") + "</option>";   
     }); 
     group.append(strHTMLSiteGroups); 
     } 
    }); 
    if (group.val()=="default"){ 
    //don't do anything 
    }else{ 
    //if a user is selected, run 
    RefreshUserLists(); 
    } 
} 

JSFiddle: http://jsfiddle.net/JevpS/

ответ

2

Код, который вызывает user.val()group.val()) выполняется перед соответствующими completefunc обработчиков из-за асинхронной природы $().SPServices вызовов. Вы можете только ожидать, что select элементов будут заполнены опциями внутри (или после - в хронологическом порядке исполнения) completefunc.

+0

должен ли я установить async на false? – Batman

+0

Это считается нежелательным, так как браузер замерзнет, ​​пока не вернется синхронный вызов ajax. Обычная практика заключается в том, чтобы поставить код, который зависит от результата асинхронного вызова в обработчике 'complete' или' success'. – Igor

+0

Ну ладно, поэтому внутри «completefunc», хорошо, я удалил списки обновления, которые запускались на document.ready, так что проблема решена. Спасибо. – Batman

0

Попробуйте использовать

var gl_var=""; 

или

gl_var = undefined 

См http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

Также Вы можете посмотреть на Thi с Difference between variable declaration syntaxes in Javascript (including global variables)?

+0

У меня есть эта строка на самом верху: var user, group, strHTMLSiteUsers, strHTMLSiteGroups, strHTMLAvailable, strHTMLAssigned, arrOptionsAssigned, arrGroups, arrUsers, intOpts, booMatch, booErr; – Batman

+0

можно изменить свой вопрос так, как у вас есть глобальная переменная ?? –

+0

Я добавил скрипт js с полным скриптом – Batman

0

Объявите свою переменную выше ready(); и определить их внутри ready();

+2

* Возможно, он работает * - Если вы не уверены, что можете ответить на вопрос, вы должны оставить комментарий. –

Смежные вопросы