2012-10-16 9 views
10

Piszę wtyczkę jquery, aby utworzyć wywołania ajax przeznaczone dla mojej aplikacji.jQuery automatyczne wykrywanie, jeśli potrzebuję użyć .html() lub .val()

Wewnątrz tej wtyczki, mój ajax wywołanie wygląda następująco (zredukowane do jakiej potrzeby zapytania):

$.ajax({ 
     url: route, 
     type: "post", 
     data: inputData, 
     success: function(response, textStatus, jqXHR) { 
      if (outputSelector !== undefined) { 

       $(outputSelector).html(response); 
       // or 
       $(outputSelector).val(response); 

      } 
     } 
    }); 

outputSelector to selektor, zdefiniowana poza wtyczki. Nie wiem, czy ten selektor to <div> lub <input>, czy nawet <select>. Czy istnieje inteligentny sposób, aby wiedzieć, czy muszę używać val(), lub html()?

+2

Czy twój selektor może być arbitralny, np '" div, input, select "'? –

+0

tak to może być –

+0

która jest strukturą odpowiedzi, którą otrzymujesz? czy możesz dać nam przykład? – svillamayor

Odpowiedz

12

Ewentualnie możemy sprawdzić, czy element ma value właściwość:

var el = $(outputSelector); 
if (el[0].value !== undefined) { 
    el.val(response); 
} else { 
    el.html(response); 
} 

tak, to trochę jak jednej linii uniwersalnym rozwiązaniem mogłoby być:

$(outputSelector).each(function() { 
    this[this.value !== undefined ? "value" : "innerHTML"] = response; 
}); 
+0

to rozwiązanie byłoby łatwiejsze w utrzymaniu, a następnie potencjalnie aktualizacji statuty przełącznika lub '.is()' selektory w dół drogi. Jedyną rzeczą, na którą warto zwrócić uwagę, jest to, że możesz potencjalnie mieć selektor, który Álvaro wspomina w komentarzach ('" div, input, select "') możesz potrzebować '.split()' na przecinku i sprawdzić każdy element indywidualnie. – kmfk

+0

Twoja droga działa bardzo dobrze, [jsfiddle] (http://jsfiddle.net/HCCsD/). Dziękuję Ci. W '$ .each()' będę w stanie obsłużyć wiele wyborów. –

+1

@Ninsuo W przypadku wielu elementów wyjściowych, możesz użyć '$ (outputSelector) .each (function() {if (this.value! == undefined) {...}});', tak jak [xdazz] (http://stackoverflow.com/a/12919512/1249581) zaproponowany. – VisioN

2

Można użyć metody .is(..) aby określić, która metoda używać.

$.ajax({ 
    url: route, 
    type: "post", 
    data: inputData, 
    success: function(response, textStatus, jqXHR) { 
     if (outputSelector !== undefined) { 
      var $output = $(outputSelector), 
       method = $output.is('input,select,textarea') ? 'val' : 'html'; 

      $output[method](response); 
     } 
    } 
}); 
0

Wewnątrz funkcji sukcesu, umieścić:

if (outputSelector !== undefined) { 
    if(outputSelector.is("input")) 
    { 
     outputSelector.val(response); 
    } 
    else if (outputSelector.is("div")) 
    { 
     outputSelector.html(response); 
    } 
} 

byłoby lepiej składni użyć instrukcji switch, ale jeśli tylko przypuszczać wejścia zostaną wykorzystane do val(), a wszystko inne jest html() następnie po prostu zastąp ostatni else if tylko else i usuń warunkowe.

4

Jeśli outputSelector jest selektorem klasy, a elementy są mieszane, należy użyć .each. Chociaż nie jest dobrze mieszać div i input z tą samą klasą, ale jeśli tworzysz wtyczkę, musisz wziąć pod uwagę taki przypadek.

$(outputSelector).each(function() { 
    if ('value' in this) { 
     $(this).val(response); 
    } else { 
     $(this).html(response); 
    } 
}); 
1

Można też zastosować metodę .prop() celu ustalenia, czy właściwość jest zdefiniowana dla danego selektora:

if ($(outputSelector).prop("value") !== undefined) 
    $(outputSelector).val(response); 
else 
    $(outputSelector).html(response); 

EXAMPLE

Ewentualnie można nam .hasOwnProperty()

Powiązane problemy