javascript - 如何从选择表单中获取 data-img-src 的实时预览?
问题描述
tl;博士
我有一个包含 png 符号名称的下拉列表,并希望在用户点击“提交”之前在下拉列表旁边显示图像的实时预览。
更详细的信息:
我有一个leaflet.js 地图,用户可以在其中放置标记。当用户这样做时,会打开一个弹出窗口,可以在其中选择标记的符号。这是下拉菜单所在的位置,当然最好预览一下符号。特别是因为有很多。
最初,我想要一个表情符号选择器样式的菜单,其中包含用于不同类别符号的不同选项卡。唉,我几乎找不到任何库/代码片段,因为我不想插入 unicode 笑脸而是 png 符号。我找到的是onesignal emoji-picker和 j query.emojiarea 插件。但我没能让他们工作。很可能是因为我是 javascript 初学者。
然后我尝试回退到 rveras 图像选择器,以寻求一种更简单但希望更容易实现的方式,但也未能使其正常工作。
现在我想,也许这是一种简单、纯粹的 jquery 方式,只是在下拉列表旁边预览 png?
所以你看,我的问题实际上是三方面的:
- 有谁知道关于如何让表情符号选择器样式菜单与 png 符号一起使用的傻瓜教程?或者...
- 谁能展示如何让图像选择器工作?或者 ..
- 你能告诉我如何用香草 jquery 或 javascript 做到这一点吗?
一个问题可能是我在一个只允许 html 作为内容的传单弹出窗口中操作,所以我的代码看起来像这样:
map.on('draw:created', function (event) {
layer = event.layer,
feature = layer.feature = layer.feature || {}; // Intialize layer.feature
feature.type = feature.type || "Feature"; // Intialize feature.type
props = feature.properties = feature.properties || {}; // Intialize feature.properties
props.name = "my name";
props.description = "my content";
props.icon = "my icon";
//picker() //execute image picker
var editablePopup = L.popup();
var content = //Textfield for the marker name
'<span><b>Enter the name</b></span><br/><input id="shapeName" type="text"/><br/><br/>' +
//Dropdown to choose the icon
'<span><b>Choose an icon</b></span></br>'+
'<select id="shapeIcon" class="image-picker">'+
'<optgroup label="Cats">'+
'<option data-img-src="http://placekitten.com/220/200" value="1">Cute Kitten 1</option>'+
'<option data-img-src="http://placekitten.com/180/200" value="2">Cute Kitten 2</option>'+
'<option data-img-src="http://placekitten.com/130/200" value="3">Cute Kitten 3</option>'+
'<option data-img-src="http://placekitten.com/270/200" value="4">Cute Kitten 4</option>'+
'</optgroup>'+
'<optgroup label="Animals">'+
'<option data-img-src="http://lorempixel.com/220/200/animals/" value="5">Animal 1</option>'+
'<option data-img-src="http://lorempixel.com/180/200/animals/" value="6">Animal 2</option>'+
'<option data-img-src="http://lorempixel.com/130/200/animals/" value="7">Animal 3</option>'+
'<option data-img-src="http://lorempixel.com/270/200/animals/" value="8">Animal 4</option>'+
'</optgroup></select></br>'+
//Textarea (flexible in size as opposed to textfield) for the general description
'<span><b>Enter a description<b/></span><br/><textarea id="shapeDesc" cols="25" rows="5"></textarea><br/><br/>'+
//Save Button that call the saveIdIW functions
'<input type="button" id="okBtn" value="Save" onclick="saveIdIW()"/>';
editablePopup.setContent(content);
editablePopup.setLatLng(layer.getLatLng());
editablePopup.openOn(map);
drawnItems.addLayer(layer);
})
如果您想查看传单地图的完整代码,我在哪里尝试,请参见此处。警告!应该很乱吧...
PS:如果您想查看实际问题,请访问fictionalmaps.com,创建一个免费帐户并在用户控制中心点击“创建地图”。
解决方案
你可以这样做on()
:
$(document).ready( function() {
$(document).on("change", "select", function() {
let img = $(this).find("option:selected").attr("data-img-src");
$("#preview").empty().append("<image src=" + img + "/>");
});
});
#preview {
display:inline-block;
position:absolute;
margin-left:20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="shapeIcon" class="image-picker">
<optgroup label="Cats">
<option data-img-src="http://placekitten.com/220/200" value="1">Cute Kitten 1</option>
<option data-img-src="http://placekitten.com/180/200" value="2">Cute Kitten 2</option>
<option data-img-src="http://placekitten.com/130/200" value="3">Cute Kitten 3</option>
<option data-img-src="http://placekitten.com/270/200" value="4">Cute Kitten 4</option>
</optgroup>
<optgroup label="Animals">
<option data-img-src="http://lorempixel.com/220/200/animals/" value="5">Animal 1</option>
<option data-img-src="http://lorempixel.com/180/200/animals/" value="6">Animal 2</option>
<option data-img-src="http://lorempixel.com/130/200/animals/" value="7">Animal 3</option>
<option data-img-src="http://lorempixel.com/270/200/animals/" value="8">Animal 4</option>
</optgroup>
</select>
<div id="preview">
</div>
<select>
更新:如评论中所述,如果同一页面上有另一个,这会导致问题。这个问题可以通过<select>
在id
事件中通过 target 来解决,change
而不是将函数绑定到所有选择。此外,预览应该已经在页面加载时显示图像。这可以通过将第一个选项设置为selected
并调用来完成change()
。
$(document).ready(function() {
$(document).on("change", "#shapeIcon", function() {
let img = $(this).find("option:selected").attr("data-img-src");
$("#preview").empty().append("<image src=" + img + "/>");
});
$("#shapeIcon optgroup option:first").attr("selected", "selected");
$("#shapeIcon").change();
});
#preview {
display:inline-block;
position:absolute;
margin-left:20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="shapeIcon" class="image-picker">
<optgroup label="Cats">
<option data-img-src="http://placekitten.com/220/200" value="1">Cute Kitten 1</option>
<option data-img-src="http://placekitten.com/180/200" value="2">Cute Kitten 2</option>
<option data-img-src="http://placekitten.com/130/200" value="3">Cute Kitten 3</option>
<option data-img-src="http://placekitten.com/270/200" value="4">Cute Kitten 4</option>
</optgroup>
<optgroup label="Animals">
<option data-img-src="http://lorempixel.com/220/200/animals/" value="5">Animal 1</option>
<option data-img-src="http://lorempixel.com/180/200/animals/" value="6">Animal 2</option>
<option data-img-src="http://lorempixel.com/130/200/animals/" value="7">Animal 3</option>
<option data-img-src="http://lorempixel.com/270/200/animals/" value="8">Animal 4</option>
</optgroup>
</select>
<div id="preview">
</div>
推荐阅读
- sql - 如何使用 SQL 和查询而不使用 SSIS 合并多个 excel 文件?
- flutter - 在扩展 EditableText“坏状态:无元素”的小部件上颤振测试 enterText:构建可编辑文本以供提及
- node.js - 将 Node 更新到 v14 后,Node/Express 服务器未连接到 postgres 数据库
- python - 姜戈 | 在哪里迭代:视图或模板
- python - Django如何在创建新项目时添加默认变体
- python - Odoo:search_count 不显示存档记录
- selenium-webdriver - 第二次调用时无法识别 PageObjects
- javascript - 如何设置 Firebase 身份验证,只有具有自定义密码的用户才能注册?
- javascript - 暗模式 TypeError:无法将属性“onClick”设置为 null
- date - 如何使用 Moment.js 忽略时区?