2013-03-18 2 views
4

먼저 선택한 요소를 초기화하려는 jq-plugin을 작성했습니다 (모두 모두). 나중에 코드에서 메서드로 생성 된 문자열을 가져 오려고합니다. 그러나 그것이 반환하는 것은 객체이지만 내 문자열은 아닙니다.jquery 플러그인 메소드 반환 값 객체가 아닙니다.

나는 인터넷에서 많은 연구를했지만, 한편으로는 '체인을 연결할 수있는'방법을, 다른 한편에서는 '어떤 값을 반환하는'방법을 모르겠다.

어떻게 생각하십니까?

(function($){ 
    var methods = { 
     init: function(val){ 
      // Actions to initialize ALL selected Elements 
     } 
     , 
     returner: function(val){ 
      alert('working with every selected element: '+$(this).width()); 
      // return anything 
      return 'STRING PRODUCED BY THIS FUNCTION!'; 
     } 
    } 

    $.fn.myplug = function(method){ 
     var args = arguments; 
     var init = 'init-myplug'; 
     return this.each(function(){ 
      var is_init = $(this).data(init); 
      if (is_init && methods[method]){ 
       return methods[method].apply($(this), Array.prototype.slice.call(args, 1)); 
      } else if (!is_init && (typeof method === 'object' || !method)){ 
       $(this).data(init, true); 
       return methods.init.apply($(this), Array.prototype.slice.call(args, 0)); 
      } 
     }); 
    }; 
})(jQuery); 

$('.selects_5_elements').myplug(); // init 

$('.selects_5_elements').myplug('returner'); // get the string 

답변

2

첫 번째 단계는 방법에서 결과를 수집하는 것입니다. 현재 콜백을 통해 메서드의 결과를 반환하려고 시도하고 있습니다 (어떤 의 반환 값은 각 콜백이 루프를 벗어나는 데 사용됩니다).

는이 같은 배열의 모든 결과를 수집 제안 :이 시점에서

var results = []; 
this.each(function(){ 
    var is_init = $(this).data(init); 
    if (is_init && methods[method]){ 
     results.push(methods[method].apply($(this), Array.prototype.slice.call(args, 1))); 
    } else if (!is_init && (typeof method === 'object' || !method)){ 
     $(this).data(init, true); 
     results.push(methods.init.apply($(this), Array.prototype.slice.call(args, 0))); 
    } 
}); 

당신이 단순히 결과 배열을 반환 할 수있다. 그러나 일부 메소드가 체인 가능하도록 허용하고 다른 메소드가 메소드 호출의 결과를 리턴하는 경우 리턴 할 값을 결정하기 위해 메소드 이름을 점검해야합니다. 또한

if (method == 'returner') 
    return results; 
else 
    return this; 

, 우리가 여기에 문자열 배열을하지 반환하는 참고. 그 이유는 메서드가 선택기와 일치하는 모든 요소에 대해 호출되기 때문입니다. 따라서 5 개의 요소가 일치하면 5 개의 문자열 배열을 얻습니다.

정말로 단일 문자열을 원하면 모든 복제본을 처리하는 방법을 결정해야합니다. 모든 문자열을 함께 결합 하시겠습니까? 또는 첫 번째 문자열 만 반환합니까? 아니면 마지막 문자열 만? 모든 옵션은 쉽게 할 수 있습니다 - 당신이 선택한 것은 요구 사항에 따라 다릅니다.

0

당신이해야 할 유일한 것은 각 콜백에 넣어하는 것입니다

SO 측면에서
if (args.length === 0) { 
    // Init your plugin 
    return this; 
} 

if (args[0] === "returner") { 
    // Generate your string 
    return "STRING PRODUCED BY THIS FUNCTION!"; 
} 
+0

, 이것은 아주 오래된 스레드입니다! – Strawberry

+0

나는 여기에서 새로운 ... 나는 질문 날짜를 보지 못했다. 죄송합니다 –

관련 문제