2011-02-17 14 views
35

पर अतिरिक्त पैरामीटर पास करें मैं एक ऐप पर काम कर रहा हूं जो उपयोगकर्ता को सर्वेक्षण पेश करेगा। मार्कअप इस तरह दिखता है:jQuery प्रत्येक() कॉलबैक

<body> 
    <div class="question" id="q1"> 
     Question 1 
    </div> 
    <div class="question" id="q2"> 
     Question 2 
    </div> 
    <!-- etc --> 
</body> 

मैं इतना Survey निर्माता में मैं कर रहा हूँ traversing jQuery each() पद्धति का उपयोग करके निर्धारित करते हैं, डोम jQuery का उपयोग करने से JavaScript ऑब्जेक्ट का निर्माण करना चाहते हैं। समस्या यह है कि कॉलबैक फ़ंक्शन के भीतर मैं प्रत्येक Question ऑब्जेक्ट को Survey.questions सरणी में जोड़ने के लिए Survey ऑब्जेक्ट का संदर्भ प्राप्त करने में असमर्थ हूं। Survey ऑब्जेक्ट का संदर्भ कैसे प्राप्त कर सकता है? कॉलबैक फ़ंक्शन में अतिरिक्त पैरामीटर (उदाहरण के लिए Survey ऑब्जेक्ट का संदर्भ) पास करने का कोई तरीका है?

function Survey() { 
    this.questions = new Array; 
    $('.question').each(function(i) { (/* Survey object */).questions.push(new Question(this)); }); 
} 

function Question(element) { 
    this.element = $(element); 
} 

उत्तर

29

से पहले आपको अधिक प्रश्न पुनरावृति अपने सर्वेक्षण के लिए एक संदर्भ बनाने के लिए सक्षम होना चाहिए।

function Survey() { 
    this.questions = new Array(); 
    var survey = this; 
    $('.question').each(function(i) { 
     survey.questions.push(new Question(this)); 
    }); 
} 

function Question(element) { 
    this.element = $(element); 
} 

var survey = new Survey(); 

$.each(survey.questions, function() { 
    $("ul").append("<li>" + this.element.text() + "</li>"); 
}); 

jsfiddle

+1

धन्यवाद! [Jsfiddle.net] के लिए +1 (http://www.jsfiddle.net) – MarioVW

15

इस हालांकि पर उदाहरण के कार्य प्रासंगिक जवाब नहीं हो सकता है, लेकिन सवाल के बाद से कैसे प्रत्येक समारोह jQuery के लिए पैरामीटर पारित करने के लिए है।

प्रथम कार्य: का प्रयोग आंशिक समारोह - more on this और closure library

jsfiddle से:

var param = 'extra-param'; 

var partial = function(fn, var_args) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    return function() { 
    // Clone the array (with slice()) and append additional arguments 
    // to the existing arguments. 
    var newArgs = args.slice(); 
    newArgs.push.apply(newArgs, arguments); 
    return fn.apply(this, newArgs); 
    }; 
}; 

$(['joe','james','rick','kirk']).each(partial (function (index,value) { 
    alert(arguments.length); 
    alert(arguments[0]); 
},param)); 

द्वितीय कार्य

$ .प्रत्येक समारोह ले जा सकते हैं या तो 2 पैरामीटर Index और Element या (जो भी रूप में this भेजा जा सकता है) यदि आप Index की जरूरत नहीं है तो आप Array $ .प्रत्येक और तत्व को तर्क यह

चेतावनी के रूप में संदर्भित कर सकते हैं पारित कर सकते हैं: आर्ग केवल आंतरिक उपयोग के लिए है - द्वारा jQuery

// Execute a callback for every element in the matched set. 
// (You can seed the arguments with an array of args, but this is 
// only used internally.) 
each: function(callback, args) { 
    return jQuery.each(this, callback, args); 
}, 

कौन सा each: function(obj, callback, args)

फोन करेगा तो callback.apply(obj[ i ], args); फोन अगर आप तर्क अन्य संगठनों के रूप में सरणी पारित erwise callback.call(obj[ i ], i, obj[ i ]);

लागू करते हैं और कहते हैं

नमूना कोड का अंतर कृपया ध्यान दें: http://jsfiddle.net/dekajp/yA89R/1/

var param = 'rick'; 
$(['joe','james','rick','kirk']).each(function (arg1 , arg2 ,arg3) { 
    //alert('[this: '+this +'] [arg1: '+ arg1 +'] [arg2:'+arg2+'] [param:'+param+']'); 
},['hello 1','hello 2','hello 3']); 

संदर्भ jQuery के लिए प्रत्येक कोड संस्करण 1,9

// args is for internal usage only 
    each: function(obj, callback, args) { 
     var value, 
      i = 0, 
      length = obj.length, 
      isArray = isArraylike(obj); 

     if (args) { 
      if (isArray) { 
       for (; i < length; i++) { 
        value = callback.apply(obj[ i ], args); 

        if (value === false) { 
         break; 
        } 
       } 
      } else { 
       for (i in obj) { 
        value = callback.apply(obj[ i ], args); 

        if (value === false) { 
         break; 
        } 
       } 
      } 

     // A special, fast, case for the most common use of each 
     } else { 
      if (isArray) { 
       for (; i < length; i++) { 
        value = callback.call(obj[ i ], i, obj[ i ]); 

        if (value === false) { 
         break; 
        } 
       } 
      } else { 
       for (i in obj) { 
        value = callback.call(obj[ i ], i, obj[ i ]); 

        if (value === false) { 
         break; 
        } 
       } 
      } 
     } 

     return obj; 
    }, 
+1

यह उत्तर प्रश्न में उठाए गए मुद्दों की एक बहुत अधिक व्यापक चर्चा है। – axlotl

7

मैं ने वही समस्या का सामना करना पड़ा।एक प्रत्येक कार्य करने के लिए परम पारित करने के लिए:

var param1 = "one"; 
var param2 = "two"; 

var params = [ param1, param2 ]; 


$('#myTable > tbody > tr').each(function(index) { 

    var param1back = params[0]; 
    var param2back = params[1]; 

},params); 
+0

मेरे लिए काम किया। बस तनाव करना चाहता था, कि पैरा हमेशा प्रकार सरणी होना चाहिए। अगर पैराम्स किसी अन्य प्रकार का है तो काम नहीं कर रहा है। –

+0

जेएसओएन ऑब्जेक्ट पैरामीटर के रूप में मेरे लिए काम किया। – David

+0

धन्यवाद, यह काम करता है, –

1

//Create extra data 
 
var dataArray = ["A", "B", "C"]; 
 

 
//Send default arguments from jQuery's each (index and item) along 
 
//with our new data argument to a named function handler. 
 
$("#myList").children().each(function(jqIndex, jqItem) 
 
          { 
 
           listItemsHandler(jqIndex, jqItem, dataArray[jqIndex]); 
 
          });  
 

 
//Named function handler accepting 3 arguments. 
 
function listItemsHandler(index, item, data) 
 
{ 
 
    console.log(index + " " + item + " " + data); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<ol id = "myList"> 
 
    <li>First</li> 
 
    <li>Second</li> 
 
    <li>Third</li> 
 
</ol>

संबंधित मुद्दे