为什么 DotNetNuke 意外地替换了我的 DOM 元素

Why does DotNetNuke unexpectedly replace my DOM elements

提问人:Vladyslav 提问时间:11/6/2023 最后编辑:Heretic MonkeyVladyslav 更新时间:11/7/2023 访问量:57

问:

我正在开发一个 9.13 DotNetNuke 自定义模块,在我的一个设置页面上有一个自定义输入字段,用于将文件上传到我的 API 控制器,但是每当我尝试向服务器发出任何 ajax 请求时,DNN 都会自动替换我的文件输入字段样式,因此它会创建一个带有类的跨度,并覆盖我的原始输入字段。此外,它还删除事件处理程序。这是我的 DOM 在 ajax 请求之前的样子:dnnInputFileWrapper

<div class="btn btn-primary btn-file" tabindex="500">
   <i class="bi-folder2-open"></i>
   <span class="hidden-xs">Browse …</span>
   <input id="my-input" type="file" multiple="">
</div>

之后:

<div class="btn btn-primary btn-file" tabindex="500">
   <i class="bi-folder2-open"></i>  
   <span class="hidden-xs">Browse …</span>
   <span class="dnnInputFileWrapper dnnSecondaryAction">Choose File
      <input id="my-input" type="file" multiple="">
   </span>
</div>

用户界面如下所示:

before ajax request

after ajax request

我试图覆盖默认的DotNetNuke CSS类,它工作正常,直到我遇到删除的事件处理程序的问题

jquery ajax dotnetnuke-9

评论

0赞 freedomn-m 11/6/2023
为什么?因为这就是它的用途。
0赞 Vladyslav 11/7/2023
@freedomn-m有什么方法可以防止这种行为吗?我能控制吗?
0赞 freedomn-m 11/7/2023
您正在使用 UI 框架,然后问“我如何不使用 UI 框架” - 回答:不要使用 dotnetnuke?我看不到屏幕截图,所以也许还有更多。
0赞 Vladyslav 11/7/2023
@freedomn-m 我不使用 dotnetnuke 不是一个选项,就我而言,我想制作一个自定义文件输入字段,看起来 DNN 不允许我这样做,但我 100% 确定,有一种方法可以做到这一点,因为我见过一些带有自定义元素的模块,例如文件输入字段
0赞 Vladyslav 11/7/2023
@freedomn-m 我的自定义样式呈现良好,但任何 ajax 请求都会触发一些内置函数,这些函数使用类“dnnInputFileWrapper”添加跨度

答:

1赞 Vladyslav 11/7/2023 #1

我找到了答案。如果您遇到问题,您应该将该类添加到您的输入字段中。normalFileUploadtype="file"

在检查了DotNetNuke dnn.jquery.js文件后,我发现了处理包装功能的函数和允许我们避免这种行为的代码行,它看起来像这样:

(function ($) {
  $.fn.dnnFileInput = function (options) {
    var opts = $.extend({}, $.fn.dnnFileInput.defaultOptions, options);

    return this.each(function () {
      var $ctrl = $(this);
      if ($ctrl.hasClass('normalFileUpload')) return;

      if (this.wrapper)
        return;

      //ignore decoration for elements in rad control.
      if ($ctrl.parents().hasClass("RadUpload"))
        return;

      // if this.wrapper is undefined, then we check if parent node is a wrapper
      if (this.parentNode && this.parentNode.tagName.toLowerCase() == 'span' && $ctrl.parent().hasClass('dnnInputFileWrapper')) {
        return;
      }

      this.wrapper = $("<span class='dnnInputFileWrapper " + opts.buttonClass + "'></span>");
      var text = $ctrl.data('text');
      text = text || 'Choose File';
      this.wrapper.text(text);
      $ctrl.wrap(this.wrapper);
      $ctrl.data("wrapper", $ctrl.parent());

      if (opts.showSelectedFileNameAsButtonText) {
        $ctrl.change(function () {
          var val = $(this).val();
          if (val != '') {
            var lastIdx = val.lastIndexOf('\\') + 1;
            val = val.substring(lastIdx, val.length);
          } else {
            val = text;
          }
          $(this).data("wrapper").get(0).childNodes[0].nodeValue = val;
        });
      }
    });
  };

  $.fn.dnnFileInput.defaultOptions = {
    buttonClass: 'dnnSecondaryAction',
    showSelectedFileNameAsButtonText: true
  };
})(jQuery);

至少它适用于 DNN 版本 9.13