DOM标签每次发生变化时如何执行js函数?

How to execute a js function every time a change occurs in a DOM tag?

我在一个表单中有 tinymce 插件,问题是表单是在满足特定条件时动态创建的,并且不断创建和删除 tinymce 容器。

我在控制台中收到此错误:

tinymce.js:25473 Uncaught TypeError: Cannot read property 'open' of undefined
    at initContentBody (tinymce.js:25473)
    at init (tinymce.js:25610)
    at init (tinymce.js:25723)
    at Editor.<anonymous> (tinymce.js:25841)
    at Array.<anonymous> (tinymce.js:7470)
    at each (tinymce.js:2585)
    at loadScripts (tinymce.js:7467)
    at tinymce.js:7454
    at HTMLScriptElement.done (tinymce.js:7362)

我想是因为tinymce不知道应该从哪里开始,但我不确定根据我的结构哪个事件可以解决这个问题。

这是我的表格:

<?php

if (isset($_POST['type'])) {
   $type = $_POST['type'];
} else {
   $type= '1';
}

switch ($tipo) {
 case '1': ?>
   <form>
   <!-- content for 1 -->
   <textarea id="text1" class="editor" cols="55" rows="20" require"></textarea>
   </form> <?php
   break;

 case '2': ?>
   <form>
   <!-- content for 2 -->
   <textarea id="text2" class="editor" cols="55" rows="20" require"></textarea>
   </form> <?php
   break;

 case '3': ?>
   <form>
   <!-- content for 3 -->
   <textarea id="text3" class="editor" cols="55" rows="20" require"></textarea>
   </form> <?php
   break;
  
 default:
   # code...
   break;
}
?>

单击按钮更改表单时,ajax 发送变量 $_POST ['type']。如果你知道如何解决这个问题,我将不胜感激你的回答。 tinymce 使用编辑器加载到 textarea class.

如果您需要任何其他信息,请问我。非常感谢。

取得的进展:

我设法找到了一种方法,让 javascript 在每次发生变化时观察 DOM 和 运行 tinymce 设置的变化:

var observeDOM = (function(){
  var MutationObserver = window.MutationObserver || window.WebKitMutationObserver, eventListenerSupported = window.addEventListener;
  return function(obj, callback){
      if( MutationObserver )
  { // define a new observer

var obs = new MutationObserver(function(mutations, observer){
  if( mutations[0].addedNodes.length || mutations[0].removedNodes.length ) callback();
}); // have the observer observe foo for changes in children

obs.observe( obj, { childList:true, subtree:true });
} else if( eventListenerSupported ){ obj.addEventListener('DOMNodeInserted', callback, false); obj.addEventListener('DOMNodeRemoved', callback, false); } } })(); // Observe a specific dom element:

observeDOM( document.getElementById('formCrear') ,function(){ 
  // console.log('dom changed');
  iniciar();
});

function iniciar() {
  tinymce.init({
    selector: ".editor",  // change this value according to your HTML
    language: "es",
    encoding: "UTF-8",
    entity_encoding: "raw",
    plugins: [
      'advlist autolink link image lists charmap print preview hr anchor pagebreak spellchecker',
      'searchreplace wordcount visualblocks visualchars code fullscreen insertdatetime media nonbreaking',
      'table template paste codesample'
    ],
    toolbar: 'styleselect | bold italic underline removeformat | alignleft aligncenter alignright alignjustify | ' +
      'bullist numlist outdent indent | link image media codesample',
    menubar: 'file edit view insert tools table',
    menu: {
      file: { title: 'File', items: 'newdocument | print' },
      edit: { title: 'Edit', items: 'undo redo | cut copy paste | selectall | searchreplace' },
      view: { title: 'View', items: 'visualaid visualchars visualblocks | preview fullscreen' },
      insert: { title: 'Insert', items: 'charmap hr | pagebreak nonbreaking anchor toc | insertdatetime' },
      table: { title: 'Table', items: 'inserttable | cell row column | tableprops deletetable' }
    },
    style_formats_merge: true,
    statusbar: false,
    width : '100%',
    height : '380',
  });
}

Tinymce 一开始显示正确,问题是如果我激活第一个表单,然后激活第二个,然后 return 到第一个,它不再激活。也就是说,它只在第一次创建表单时被激活,如果它被更改为另一个然后 returns 到之前显示的那个,它不再出现,直到页面重新加载。

好吧,我是这样解决的:我必须在 tinymce 的两个文件中添加 mutationobserver,以便在完成操作时连续读取它们,在 DOM 中观察到变化然后它读取包含tinymce工作数据的函数的数据。

init();
$('.listBlog a').on('click', function(){
  var observeDOM = (function(){
    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver, eventListenerSupported = window.addEventListener;
    return function(obj, callback){
        if( MutationObserver ) { // define a new observer
  
      var obs = new MutationObserver(function(mutations, observer){
        if( mutations[0].addedNodes.length || mutations[0].removedNodes.length )
        callback();
        obs.disconnect();
      }); // have the observer observe foo for changes in children
      
      obs.observe( obj, { childList:true, subtree:true });
      } else if ( eventListenerSupported ){
        obj.addEventListener('DOMNodeInserted', callback, false);
        obj.addEventListener('DOMNodeRemoved', callback, false);
      }  
    }
  })(); // Observe a specific dom element:

  observeDOM( document.getElementById('formCrear') ,function(){ 
    // console.log('dom changed');
    init();
  });
  
});

function init() {
// data of custom.tinymce.js
}

相同,但在文件中 tinymce.min.js