ClientJS: Ziel-Argument bestimmter Funktionen vorne trimmen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 29 Jun 2015 11:22:31 +0000 (13:22 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 29 Jun 2015 11:22:31 +0000 (13:22 +0200)
jQuery kann aus HTML-Strings DOM-Objekte bauen:
$("<p>stuff</p>"). Beginnt der HTML-String mit Leerzeichen, so croakt
jQuery daran. Daher bei den betroffenen Funktionen, die immer auf einem
so gebauten DOM-Objekt hantieren, das Ziel-Argument um führende
Leerzeichen bereinigen.

SL/ClientJS.pm

index f1c949e..335bf81 100644 (file)
@@ -122,6 +122,8 @@ my %supported_methods = (
   scroll_into_view       => 1,  # $(<TARGET>)[0].scrollIntoView()
 );
 
+my %trim_target_for = map { ($_ => 1) } qw(insertAfter insertBefore appendTo prependTo);
+
 sub AUTOLOAD {
   our $AUTOLOAD;
 
@@ -154,6 +156,11 @@ sub action {
     $args[$idx] = "" . $args[$idx] if ref($args[$idx]) eq 'SL::Presenter::EscapedText';
   }
 
+  # Trim leading whitespaces for certain jQuery functions that operate
+  # on HTML code: $("<p>test</p>").appendTo('#some-id'). jQuery croaks
+  # on leading whitespaces, e.g. on $(" <p>test</p>").
+  $args[0] =~ s{^\s+}{} if $trim_target_for{$method};
+
   push @{ $self->_actions }, [ $method, @args ];
 
   return $self;