it-swarm.com.de

Javascript "einmal ist keine Funktion" -Fehler nach dem Einschließen der Bibliothek

Ich habe ein kleines Modul, das die Javascript-Bibliothek JSmol enthält. Diese Bibliothek rendert molekulare Strukturen auf dem Bildschirm. Das Hauptmodul heißt jmol. Es enthält ein Element, eine twig Vorlage, eine kleine Javascript-Datei und die offizielle JSmol-Bibliothek.

Wenn ich ein Element auf der Seite erstelle, wird das Element korrekt gerendert, die Admin-Symbolleiste jedoch nicht. Die Javascript-Konsole hebt 4 Stellen hervor, an denen die "einmal" -Funktion verwendet wird, und zwar alle im Code, nachdem die Herstellerbibliothek aufgenommen wurde. Ein Beispiel ist folgendes:

TypeError: $ (...). Once ist keine Funktion

  Drupal.behaviors.escapeAdmin = {
    attach: function () {
      var $toolbarEscape = $('[data-toolbar-escape-admin]').once('escapeAdmin');

meine Javascript-Datei ist ganz einfach:

(function ($, Drupal, drupalSettings, Jmol) {
  'use strict';
  Drupal.behaviors.jmol = {
    attach: function () {
      var Info = drupalSettings.jmol.mydiv.info;
      $('#mydiv').html(Jmol.getAppletHtml("jmolApplet0", Info))
    }
  };
}(jQuery, Drupal, drupalSettings, Jmol));

Ist es möglich, dass der Herstellercode dies bricht, oder habe ich das getan?

Bearbeiten: Hier ist meine Datei jmol.libraries.yml:

jmol:
  version: 1.x
  js:
    lib/JSmol.min.js: {}
    js/jmol.js: {}
  dependencies:
    - core/drupalSettings
    - core/jquery
    - [I've tried adding core/jquery.once here to no avail]
2
Kevin Nowaczyk

Es stellte sich heraus, dass in der von mir verwendeten Version der Bibliothek jQuery integriert war. Es gibt eine JSmol.min.nojq.js, für die eine externe Version von jQuery erforderlich ist.

0
Kevin Nowaczyk

Ich hatte dies auch in meinem benutzerdefinierten Modul geschehen. Ich bemerkte dann, dass es funktionierte, als ich angemeldet war, aber sobald ich nicht authentifiziert war, würde mein Code diesen JS-Fehler auslösen. Am Ende war es einfach ein Problem, bei dem ich die Abhängigkeit benötigte, die Sie bereits in meinen Abhängigkeiten von benutzerdefinierten Modulbibliotheksdateien aufgeführt haben:

dependencies:
- core/drupalSettings
- core/jquery
- core/jquery.once

Nachdem ich dies hinzugefügt hatte, wurde die erforderliche JS-Datei auch aufgenommen, wenn sie nicht authentifiziert war.

Für ein paar zusätzliche Informationen, die das Einfügen der folgenden JS-Datei erzwangen:

Es sieht so aus, als hätten Sie Ihre spezifische Instanz gelöst, bei der mehrere Versionen von jQuery installiert wurden. Ich würde das nach Möglichkeit vermeiden, da es die Dinge etwas kompliziert.

15
Keenan Holloway

Ich bin noch kein Drupal 8-Typ. Ich benutze immer noch sehr viel 7). Ich habe jedoch einige Dinge gefunden, die hilfreich sein könnten.

once() ist keine zentrale jquery-Methode. Ich denke, es ist ein JQuery-Plugin für drupal 7 ( Source ). Ich weiß nicht, ob dieses Plugin in Drupal = 8.

Soll diese Bibliothek auf drupal 7 und nicht vollständig auf drupal 8) portiert werden?

Eine einfache Version von once(), die ich für meine eigene (nicht drupale) Site erstellt habe, sieht folgendermaßen aus:

$.fn.once = function(processed_class)
{
  if (typeof processed_class == 'undefined')
  {
    processed_class = 'processed';
  }
  return this.not('.' + processed_class).addClass(processed_class);
};

Sie können dies zu Ihrem Code außerhalb von document.ready oder drupal.behaviors (globaler Bereich) hinzufügen, und es funktioniert möglicherweise. Möglicherweise müssen Sie auch Ihre js-Datei vor Ihrem Plugin einfügen.

Was Ihre Fehler und das fehlende Menü betrifft, kann ein einzelner Javascript-Fehler das Laden des verbleibenden Javascript-Formulars auf der Seite blockieren. Da die Admin-Symbolleiste js ist, wird sie wahrscheinlich nie aufgerufen.

1
danielson317