41

我在 Boostrap 模式对话框中使用 tinyMCE4 编辑器。当我单击链接图标时,它会打开一个新的模式对话框,它显示得很好,但输入区域不可编辑。

<div id="editing" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <form>
    <label>
      <span>Description</span>
      <div id="description"></div>
    </label>
     <form>
 </div>

  <script>
    tinymce.init({
    selector: 'div#description',
    inline: false,
    theme : "modern",
    schema: "html5",
    add_unload_trigger: false,
    statusbar: false,
    plugins: "link",
    toolbar: "link | undo redo",
    menubar: false
 });
    </script>

在此处输入图像描述

有什么建议么

提前致谢

4

12 回答 12

78

来自https://github.com/tinymce/tinymce/issues/782

对于 jQuery UI 对话框,您可以这样做:

$.widget("ui.dialog", $.ui.dialog, {
    _allowInteraction: function(event) {
        return !!$(event.target).closest(".mce-container").length || this._super( event );
    }
});

这似乎是一个更通用的解决方案,您可以针对 Bootstrap 进行修改:

$(document).on('focusin', function(e) {
    if ($(e.target).closest(".mce-window").length) {
        e.stopImmediatePropagation();
    }
});

更新:

对于新版本的 ag-grid (20.2.0),如果您使用的是银色主题,则已mce-window重命名为,tox-dialog因此您只需更改目标类即可。

$(document).on('focusin', function(e) {
    if ($(e.target).closest(".tox-dialog").length) {
        e.stopImmediatePropagation();
    }
});
于 2013-08-13T12:50:08.850 回答
8

也遇到了这个问题。prabu 在他的 JS Fiddle 上提供的代码几乎可以完美运行。

我必须对其进行轻微修改,以便在 MoxieManager 字段打开时也能正常工作。

$(document).on('focusin', function(e) {
    if ($(e.target).closest(".mce-window").length || $(e.target).closest(".moxman-window").length) {
        e.stopImmediatePropagation();
    }
});

当在 Bootstrap Modal 中打开时,这允许在 MoxieManager 中编辑图像或重命名文件路径。谢谢你。

于 2014-09-12T21:08:20.967 回答
5

先前的答案似乎不适用于 Bootstrap v4 和 TinyMCE v5。这是修改后的解决方案应该可以工作:

  $(document).on('focusin', function(e) {
        if ($(e.target).closest(".tox-textfield").length)
            e.stopImmediatePropagation();
  });
于 2019-04-11T10:58:04.953 回答
3

对于所有使用 Material UI 并寻找解决方案的人:在您的 Modal/Dialog 中设置 disableEnforcedFocus = true... 这是因为默认情况下,material ui 会获得焦点,而您打开的 whaterver 组件将不会获得焦点所以你必须手动完成。

于 2020-04-29T11:05:47.673 回答
3

2019年解决方案:

$(document).on('focusin', function(e) {
    if ($(e.target).closest(".mce-window").length) {
        e.stopImmediatePropagation();
    }
});
于 2019-03-13T10:13:43.077 回答
2

该示例报告于: http: //fiddle.jshell.net/e99xf/13/show/light/

适用于旧版本的 bootstrap (2.3.2) 和 jQuery (1.8.3)

我正在尝试使用最新版本,但它不起作用:Bootstrap 3.3.7 / jQuery 3.2.1

下面是我正在使用的(记住您输入的链接在旧版本的 js 中完美运行)。

附言。我正在使用 w3schools.com 编辑器

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  <script src="http://tinymce.cachefly.net/4.0/tinymce.min.js"type=" text/javascript"></script>  
</head>
<body>
<script type='text/javascript'>//<![CDATA[
$(window).load(function(){
tinymce.init({
    selector: "textarea",
    width:      '100%',
    height:     270,
    plugins:    [ "anchor link" ],
    statusbar:  false,
    menubar:    false,
    toolbar:    "link anchor | alignleft aligncenter alignright alignjustify",
    rel_list:   [ { title: 'Lightbox', value: 'lightbox' } ]
});

/**
 * this workaround makes magic happen
 * thanks @harry: http://stackoverflow.com/questions/18111582/tinymce-4-links-plugin-modal-in-not-editable
 */
$(document).on('focusin', function(e) {
    if ($(event.target).closest(".mce-window").length) {
    e.stopImmediatePropagation();
    }
});
});//]]> 

</script>

<div class="container">
  <h2>Modal Example</h2>


     <div class="col-sm-8">
       <div class="form-group">          
        <br>
        <label for="BL_DEF_MASCARA" class="control-label">Texto a ser exibido</label>
        <br>

        <div class="help-block with-errors"></div>
       </div>
     </div>  
<br>

  <!-- Trigger the modal with a button -->
  <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button>

  <!-- Modal -->
  <div class="modal fade" id="myModal" role="dialog">
    <div class="modal-dialog">

      <!-- Modal content-->
      <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal">&times;</button>
      <h4 class="modal-title">Modal Header</h4>
    </div>
    <div class="modal-body">
      <textarea rows="4" cols="100" class="form-control" name="BL_DEF_MASCARA"></textarea>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
    </div>
      </div>

    </div>
  </div>

</div>

</body>
</html>
于 2017-11-21T13:52:47.330 回答
1

我最后的解决方法是将出现对话框的 z-index 设置为高于模态对话框的 z-index。例如,这可以解决问题:

$(document).on('focusin', function(e) {
        if ($(e.target).closest(".tox-tinymce-aux, .moxman-window, .tam-assetmanager-root, .tox-dialog").length) {
            $('.tox-dialog').css('z-index', '2003');
            e.stopImmediatePropagation();
        }
    });

很确定你也可以全局设置css

于 2020-01-08T13:21:51.897 回答
0

尝试

event.stopImmediatePropagation();

代替

e.stopImmediatePropagation();

为我工作

于 2014-01-16T15:19:09.553 回答
0

就我而言,它是通过以下代码解决的:

$(document).on('focusin', (e) => {
    if ($(e.target).closest('.mce-window').length) {
       $('.ModalHeader').attr('tabindex', '');
   }
});
于 2017-08-07T10:21:26.673 回答
0

对于 bootstrap 5 和 Tinymce v4.7.9

尝试

 document.addEventListener('focusin', function(e) {
    if (e.target.closest(".mce-window") !== null) {
    e.stopImmediatePropagation();
    }
  });

这个对我有用

于 2022-03-04T06:58:55.933 回答
0

要在 Bootstrap UI 对话框中呈现 TinyMCE 实例,请添加以下代码:

Bootstrap 4 或更低版本

// Prevent Bootstrap dialog from blocking focusin
$(document).on('focusin', function(e) {
  if ($(e.target).closest(".tox-tinymce, .tox-tinymce-aux, .moxman-window, .tam-assetmanager-root").length) {
     e.stopImmediatePropagation();
  }
});

Bootstrap 5 或更高版本

 // Prevent Bootstrap dialog from blocking focusin
  document.addEventListener('focusin', (e) => {
   if (e.target.closest(".tox-tinymce-aux, .moxman-window, .tam-assetmanager-root") !== null) {
      e.stopImmediatePropagation();
   }
  });
  
于 2022-01-14T05:17:35.530 回答
0

此页面上的解决方案似乎都不适用于 Firefox。

在 chrome 中,如果我执行下面的代码,它会导致焦点事件。如果我将事件更改为 e 参数,它在 chrome 中不起作用。

在 chrome 中解决它的事件称为焦点事件。我没有设法用 Firefox 找到这个。

有人让它在 Firefox 中工作吗?

$(document).on('focusin', (e) => {
    if ($(event.target).closest('.mce-window').length) {
      event.stopImmediatePropagation(); 
   }
});
于 2019-02-06T19:12:10.977 回答