如何在循环中使用 JavaScript
How to use JavaScript in a loop
我有这个javascript
<script>
$(document).ready(function() {
$('.summernote1').summernote({
placeholder: 'start typing',
lang: 'en-GB',
height: 300, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true, // set focus to editable area after initializing summernote
callbacks: {
onImageUpload: function(files) {
for (var i = 0; i < files.length; i++) {
send(files[i]);
}
}
}
});
});
function send(file) {
var xhttp;
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
response = JSON.parse(this.responseText);
const urls = response.url;
urls.forEach(imgurls);
function imgurls(item) {
$('.summernote1').summernote('insertImage', item);
}
}
};
var data = new FormData();
data.append('files[]', file);
xhttp.open("POST", "/admin/ans-img-upload", true);
xhttp.send(data);
}
//第二个
$(document).ready(function() {
$('.summernote2').summernote({
placeholder: 'start typing',
lang: 'en-GB',
height: 300, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true, // set focus to editable area after initializing summernote
callbacks: {
onImageUpload: function(files) {
for (var i = 0; i < files.length; i++) {
send(files[i]);
}
}
}
});
});
function send(file) {
var xhttp;
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
response = JSON.parse(this.responseText);
const urls = response.url;
urls.forEach(imgurls);
function imgurls(item) {
$('.summernote2').summernote('insertImage', item);
}
}
};
var data = new FormData();
data.append('files[]', file);
xhttp.open("POST", "/admin/ans-img-upload", true);
xhttp.send(data);
}
</script>
然后我有这个html代码
<textarea class="form-control summernote1" id="summernote1" name="af_options[]"></textarea>
<textarea class="form-control summernote2" id="summernote2" name="af_options[]"></textarea>
现在如果我想在summernote1上传图片,图片会插入到summernote2的最后一个textarea中。
请问我该如何解决这个问题,无论如何我可以在所有文本区域中使用 1 javascript 代码而不是重复 javascript 代码,因为我有一个循环多个文本区域的 foreach .
请帮忙
感谢您的解决方案....
现在我怎样才能附加更多字段...我有下面的代码,但它不适用于图像插入
function add_more_additional_field() {
$('#additional_options').append(
'<textarea class="summernote" id="summernote" name="af_options[]" placeholder="Start typing the answers here"></textarea>'
);
$(document).ready(function() {
$([...document.querySelectorAll('#additional_options .summernote')].pop()).summernote();
});
}
您的 send()
函数定义存在冲突。添加 class 作为参数。
function send(file, summerclass) {
...
function imgurls(item) {
$(summerclass).summernote('insertImage', item);
}
并从 ready()
.
传递
send(files[i],'.summernote1');
function send(file)
的第二个定义覆盖了第一个
您应该只有一个 send
定义,并添加第二个参数以包含正确的文本区域。
function send(file, $el) {
var xhttp;
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
response = JSON.parse(this.responseText);
const urls = response.url;
urls.forEach(imgurls);
function imgurls(item) {
// Use the passed textarea instead of a hard-coded value
$el.summernote('insertImage', item);
}
}
};
var data = new FormData();
data.append('files[]', file);
xhttp.open("POST", "/admin/ans-img-upload", true);
xhttp.send(data);
}
要利用这一点,您还需要更新 document.ready
回调。您将无法更改 onImageUpload
回调的参数,因此您需要“嵌入”正确的元素。有几种方法可以做到这一点,但我更喜欢在引用正确元素的变量周围创建一个闭包,因为这样以后重构起来很容易。
$(document).ready(function() {
$('.summernote1').summernote({
placeholder: 'start typing',
lang: 'en-GB',
height: 300, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true, // set focus to editable area after initializing summernote
callbacks: {
onImageUpload: (() => {
let $el = $('.summernote1');
return function(files) {
for (var i = 0; i < files.length; i++) {
send(files[i], $el);
}
};
})()
}
});
});
这将创建一个 IIFE,它在 $el
周围形成一个闭包,并在触发 onImageUpload 回调时将其传递给 send()
。
你可以为 .summernote2
做同样的事情,在你的另一个 document.ready
为 .summernote2
可能需要进行更多重构以进一步减少代码重复。
您可以将所有类名更改为 summernote
并使用 $('.summernote')
到 select 并应用 summernote()
.
棘手的部分是存储 $(this)
并将其传递给 send
函数。
$(document).ready(function () {
$(".summernote").each(function () {
const self = $(this); // store self as this and this is referenced to each .summernote element.
self.summernote({
placeholder: "start typing",
lang: "en-GB",
height: 300, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true, // set focus to editable area after initializing summernote
callbacks: {
onImageUpload: function (files) {
for (var i = 0; i < files.length; i++) {
send(files[i], self); // pass selft to send function
}
},
},
});
});
});
function send(file, context) {
var xhttp;
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
response = JSON.parse(this.responseText);
const urls = response.url;
urls.forEach(item => {
context.summernote("insertImage", item);
});
}
};
var data = new FormData();
data.append("files[]", file);
xhttp.open("POST", "/admin/ans-img-upload", true);
xhttp.send(data);
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<!-- include summernote css/js -->
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.js"></script>
<textarea class="form-control summernote" id="summernote1" name="af_options[]"></textarea>
<br />
<br />
<textarea class="form-control summernote" id="summernote2" name="af_options[]"></textarea>
我有这个javascript
<script>
$(document).ready(function() {
$('.summernote1').summernote({
placeholder: 'start typing',
lang: 'en-GB',
height: 300, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true, // set focus to editable area after initializing summernote
callbacks: {
onImageUpload: function(files) {
for (var i = 0; i < files.length; i++) {
send(files[i]);
}
}
}
});
});
function send(file) {
var xhttp;
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
response = JSON.parse(this.responseText);
const urls = response.url;
urls.forEach(imgurls);
function imgurls(item) {
$('.summernote1').summernote('insertImage', item);
}
}
};
var data = new FormData();
data.append('files[]', file);
xhttp.open("POST", "/admin/ans-img-upload", true);
xhttp.send(data);
}
//第二个
$(document).ready(function() {
$('.summernote2').summernote({
placeholder: 'start typing',
lang: 'en-GB',
height: 300, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true, // set focus to editable area after initializing summernote
callbacks: {
onImageUpload: function(files) {
for (var i = 0; i < files.length; i++) {
send(files[i]);
}
}
}
});
});
function send(file) {
var xhttp;
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
response = JSON.parse(this.responseText);
const urls = response.url;
urls.forEach(imgurls);
function imgurls(item) {
$('.summernote2').summernote('insertImage', item);
}
}
};
var data = new FormData();
data.append('files[]', file);
xhttp.open("POST", "/admin/ans-img-upload", true);
xhttp.send(data);
}
</script>
然后我有这个html代码
<textarea class="form-control summernote1" id="summernote1" name="af_options[]"></textarea>
<textarea class="form-control summernote2" id="summernote2" name="af_options[]"></textarea>
现在如果我想在summernote1上传图片,图片会插入到summernote2的最后一个textarea中。
请问我该如何解决这个问题,无论如何我可以在所有文本区域中使用 1 javascript 代码而不是重复 javascript 代码,因为我有一个循环多个文本区域的 foreach .
请帮忙
感谢您的解决方案....
现在我怎样才能附加更多字段...我有下面的代码,但它不适用于图像插入
function add_more_additional_field() {
$('#additional_options').append(
'<textarea class="summernote" id="summernote" name="af_options[]" placeholder="Start typing the answers here"></textarea>'
);
$(document).ready(function() {
$([...document.querySelectorAll('#additional_options .summernote')].pop()).summernote();
});
}
您的 send()
函数定义存在冲突。添加 class 作为参数。
function send(file, summerclass) {
...
function imgurls(item) {
$(summerclass).summernote('insertImage', item);
}
并从 ready()
.
send(files[i],'.summernote1');
function send(file)
的第二个定义覆盖了第一个
您应该只有一个 send
定义,并添加第二个参数以包含正确的文本区域。
function send(file, $el) {
var xhttp;
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
response = JSON.parse(this.responseText);
const urls = response.url;
urls.forEach(imgurls);
function imgurls(item) {
// Use the passed textarea instead of a hard-coded value
$el.summernote('insertImage', item);
}
}
};
var data = new FormData();
data.append('files[]', file);
xhttp.open("POST", "/admin/ans-img-upload", true);
xhttp.send(data);
}
要利用这一点,您还需要更新 document.ready
回调。您将无法更改 onImageUpload
回调的参数,因此您需要“嵌入”正确的元素。有几种方法可以做到这一点,但我更喜欢在引用正确元素的变量周围创建一个闭包,因为这样以后重构起来很容易。
$(document).ready(function() {
$('.summernote1').summernote({
placeholder: 'start typing',
lang: 'en-GB',
height: 300, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true, // set focus to editable area after initializing summernote
callbacks: {
onImageUpload: (() => {
let $el = $('.summernote1');
return function(files) {
for (var i = 0; i < files.length; i++) {
send(files[i], $el);
}
};
})()
}
});
});
这将创建一个 IIFE,它在 $el
周围形成一个闭包,并在触发 onImageUpload 回调时将其传递给 send()
。
你可以为 .summernote2
做同样的事情,在你的另一个 document.ready
为 .summernote2
可能需要进行更多重构以进一步减少代码重复。
您可以将所有类名更改为 summernote
并使用 $('.summernote')
到 select 并应用 summernote()
.
棘手的部分是存储 $(this)
并将其传递给 send
函数。
$(document).ready(function () {
$(".summernote").each(function () {
const self = $(this); // store self as this and this is referenced to each .summernote element.
self.summernote({
placeholder: "start typing",
lang: "en-GB",
height: 300, // set editor height
minHeight: null, // set minimum height of editor
maxHeight: null, // set maximum height of editor
focus: true, // set focus to editable area after initializing summernote
callbacks: {
onImageUpload: function (files) {
for (var i = 0; i < files.length; i++) {
send(files[i], self); // pass selft to send function
}
},
},
});
});
});
function send(file, context) {
var xhttp;
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
response = JSON.parse(this.responseText);
const urls = response.url;
urls.forEach(item => {
context.summernote("insertImage", item);
});
}
};
var data = new FormData();
data.append("files[]", file);
xhttp.open("POST", "/admin/ans-img-upload", true);
xhttp.send(data);
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<!-- include summernote css/js -->
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.js"></script>
<textarea class="form-control summernote" id="summernote1" name="af_options[]"></textarea>
<br />
<br />
<textarea class="form-control summernote" id="summernote2" name="af_options[]"></textarea>