تعيين القيم إلى قائمة المتغيرات العمومية في JavaScript

مهلا الآن أنا باستخدام jQuery ولدي بعض المتغيرات العالمية لعقد قليلا من الاشياء اياكس مسبقة التحميل (مسبقة لجعل الصفحات تأتي لطيفة وسريعة):


$.get("content.py?pageName=viewer", function(data)
    {viewer = data;});
$.get("content.py?pageName=artists", function(data)
    {artists = data;});
$.get("content.py?pageName=instores", function(data)
    {instores = data;});
$.get("content.py?pageName=specs", function(data)
    {specs = data;});
$.get("content.py?pageName=about", function(data)
    {about = data;});

كما ترون ، لدينا انتهاك كبير لمبدأ جاف ، ولكن ... لا أرى حقاً طريقة لإصلاحه ... أي أفكار؟

ربما مجموعة؟

1

6 إجابة

باستخدام jQuery كل طريقة لتكرارها من خلال مصفوفة من أسماء الصفحات ثم إعداد متغير عام (في نطاق الإطار):

jQuery.each(
    ["viewer", "artists", "instores", "specs", "about"],
    function (page) {
        $.get("content.py?pageName=" + page,
            new Function("window[" + page + "] = arguments[0]"));
    }
);

Update: Actually, you don't even need the "new Function":

jQuery.each(
    ["viewer", "artists", "instores", "specs", "about"],
    function (page) {
        $.get("content.py?pageName=" + page, function() { window[page] = arguments[0]; });
    }
);
6
وأضاف
أنا أحب jQuery ... ولكن الإجابة Shog هو الذي حل مشكلتي فعلا:/الشكر على الرغم من :)
وأضاف المؤلف Jiaaro, مصدر
استخدام جيد من jQuery.each ()!
وأضاف المؤلف Shog9, مصدر

لا تحتاج إلى eval() أو Function() لهذا الغرض. وهناك مجموعة ، كما تشك في ذلك ، ستقوم بالمهمة بشكل جيد:

(function()//keep outer scope clean
{
  //pages to load. Each name is used both for the request and the name
  //of the property to store the result in (so keep them valid identifiers
  //unless you want to use window['my funky page'] to retrieve them)
   var pages = ['viewer', 'artists', 'instores', 'specs', 'about'];

   for (var i=0; i
5
وأضاف

يمكنك تجنب eval باستخدام وظيفة جديدة:

var names = ['viewer', 'artists', 'instores', 'specs', 'about'];
for (var i = 0; i < names.length; i++)
   $.get("content.py?pageName=" + names[i], new Function('data', names[i] + ' = data;'));

ليس أفضل بكثير على الرغم من tbh

2
وأضاف

يمكنك الاتصال مرة واحدة بهذه الصفحة ، وإرجاع كائن json بدلاً من النص

{
viewer:'me',
artists:'you',
instores:'instores',
specs:'specs',
about:'about'
}

و eval ذلك منذ الآن تقوم بالاتصال بـ N مرات الخادم الخاص بك ، وهذا يبطئ كل شيء ، يجب عليك إعادة النظر في المنطق الخاص بك!

PS. أثناء كتابتي رأيت الإجابة RoBorg ، كما ترى ، عند استخدام وظيفة جديدة كنت تستخدم eval تحت غطاء محرك السيارة ، لذلك إذا كنت ترغب في استخدامه لأنها تذهب (في بعض المتصفح هو أيضا أسرع)

0
وأضاف

هذا لا يستخدم eval ، على الرغم من أنه أكثر كلامية.

function get_content(name){
   $.get("content.py?pageName=" + name, function(data){ window[name] = data;});
}

var names = ['viewer', 'artists', 'instores', 'specs', 'about'];
for (var i = 0; i < names.length; i++)
    get_content(names[i]);

لكن أحد المجيبين جعل نقطة جيدة ، ربما ينبغي عليك محاولة الجمع بين كل هذه الطلبات في واحدة وإلا سيتم ضرب الخادم الخاص بك 6 مرات للمحتوى الديناميكي على كل طلب من الصفحة.

0
وأضاف