2016-08-24 3 views
1

Dies ist mein erster Beitrag, also bitte nehmen Sie es mir einfach :)Funktion Argumente als Text nicht funktioniert

Ich versuche, eine wiederverwendbare Funktion namens alertControls() zu erstellen. Ich versuche, die Argumente Bits zu machen, die ich in den HTML-Strings ersetzen kann, die in der Funktion aufgerufen werden, aber einen Fehler erhalte, wenn ich versuche, es so zu machen. Ich habe ein paar verschiedene Möglichkeiten ausprobiert, aber bin verwirrt, warum dies nicht in JS funktionieren würde:

function alertControls(parent, icon, alert, message) { 
    parent = "form-group has-warning has-feedback"; 
    icon = "warning-sign"; 
    alert = "warning"; 
    message = "Password too short"; 

    $(this).closest("div").removeClass(); 
    $('.alert').remove(); 
    $('span').not('.input-group-addon,.hidden-xs,.caret').remove(); 
    $(this).closest("div").addClass(parent); 
    $(this).before('<span class="glyphicon glyphicon-' + icon + 'form-control-feedback" aria-hidden="true"></span>'); 
    $(this).closest("div").append('<div class="alert alert-' + alert + ' alert-strong is-attached"><em class="glyphicon glyphicon-remove-sign"></em> <strong>' + message + '</strong></div>'); 
} 

Dann möchte ich mit unterschiedlichen Werten in der Funktion html wieder zu verwenden können:

alertControls("form-group has-error has-feedback", "error-sign", "error", "Not valid"); 

Viele Danke für jede Hilfe

+3

* "aber bekomme einen Fehler" * Und was ist das für ein Fehler? Was erwarten Sie von "this" in der Funktion? In welchem ​​Kontext wird die Funktion aufgerufen? –

+2

Remove parent = "", icon = "" ... Dies überschreibt die übergebenen Werte –

+1

jsfiddle ?? oder irgendein Beispiel mit Code. – Cuchu

Antwort

0

Sie könnten den Elementselektoreinrichtung als zusätzliches Argument übergeben (es die erste machen):

function alertControls(selector, parent, icon, alert, message) { 
    // define default values, but only use them when no value supplied: 
    parent = parent || "form-group has-warning has-feedback"; 
    icon = icon || "warning-sign"; 
    alert = alert || "warning"; 
    message = message || "Password too short"; 

    // get element(s) for selector, and use that instead of `this` 
    var $elem = $(selector); 
    $elem.closest("div").removeClass(); 
    $('.alert').remove(); 
    $('span').not('.input-group-addon,.hidden-xs,.caret').remove(); 
    $elem.closest("div").addClass(parent); 
    $elem.before('<span class="glyphicon glyphicon-' + icon + 'form-control-feedback" aria-hidden="true"></span>'); 
    $elem.closest("div").append('<div class="alert alert-' + alert + ' alert-strong is-attached"><em class="glyphicon glyphicon-remove-sign"></em> <strong>' + message + '</strong></div>'); 
} 

nennen es wie folgt aus:

alertControls("input#test", "form-group has-error has-feedback", "error-sign", "error", "Not valid"); 

Sie könnten alternativ aussehen in einem jQuery-Plug-in, das Erstellen und dann würden Sie diese Syntax verwenden:

$("input#test").alertControls("form-group has-error has-feedback", "error-sign", "error", "Not valid"); 

Aber für diesen speziellen Fall glaube ich nicht, dass nützlich ist. jQuery-Plugins sollten keine Abhängigkeiten haben, wie Sie sie in Ihrem Code haben, wo erwartet wird, dass es ein Elternteil div und ein Element mit Klasse alert usw. gibt.

+0

Danke @trincot, das hat wunderbar funktioniert, vielen Dank für die Hilfe von allen, trotz meiner schlechten Informationen , wird versuchen, in der Zukunft vollen Code mit jsfiddle Beispielen bekannt zu geben. :) –

4
  1. Sie weisen Parametern neue Werte zu. Wenn ich ein Problem verstanden habe, sollten Sie es ändern in:

message = message || "Password too short"; und so weiter.

  1. Ihre Verwendung von this ist falsch. Vielleicht haben Sie ein anderes Attribut übergeben, sagen element und es statt $(this) verwenden, so wäre es:

    if ($('input#test').val() === "") { alertControls($('input#test'), "form-group has-error has-feedback", "error-sign", "error", "Not valid"); }

+0

Dies ist jedoch nicht das Hauptproblem – trincot

+0

@trincot gut ... vielleicht. Es ist unklar, was 'this' sein sollte – k102

+0

In der Tat, und die Art, wie das OP die Funktion aufruft, ist es sehr unwahrscheinlich, dass diese Verbesserung allein ihren Code zum Laufen bringen wird. – trincot

0

Was Sie tun:

function a(b){ 
b=1;//overides b 
return b; 
} 
a(5);//returns also 1 

außer Kraft setzen Sie den Wert ein. Tun Sie das einfach nicht. Wenn Sie einen Standardwert haben wollen, die verwendet wird, wenn kein Wert übergeben wird, können Sie neue ECMA6 Syntax:

function a(b=1){ 
return b; 
} 
a();//returns 1 
a(5); //returns 5 

Problem 2: „dieses“ kehrt das übergeordnete Objekt einer Funktion. Wenn Sie Ihre Funktion in js aufrufen, ist dies das Fensterobjekt.

function a(){ 
return this; 
} 
a(); //will return window 

So müssen Sie das Element eine andere Art und Weise zu bekommen, vielleicht ist es an die Funktion übergeben oder mit:

$("#uniqueselector") 
Verwandte Themen