- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
使用ajax查询产品后尝试打开包含产品详细信息的模式时出现错误
错误本身:
Uncaught SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at HTMLButtonElement.<anonymous> (scripts.js:54)
at HTMLDocument.dispatch (jquery-3.3.1.js:5183)
at HTMLDocument.elemData.handle (jquery-3.3.1.js:4991)
需要明确的是:我有一些过滤器,其结果在 python filter_items
函数中过滤,然后使用 JSONResponse 将其发送到前端以字典的形式(Item 模型中的 as_dict()
函数)将它们添加到隐藏输入
值中。 JS 函数获取隐藏的输入值并使用该输入中的数据呈现过滤结果。
借助过滤功能查询的项目模型:
class Item(models.Model):
ITEM_TYPES = (
('UM', 'Umbrella'),
('SK', 'Skirt'),
('TR', 'Trousers'),
('OT', 'Other')
)
BRANDS = (
('VS', 'Versace'),
('SP', 'Supreme'),
('SI', 'Stone Island'),
('FP', 'Fred Perry'),
)
title = models.CharField(max_length=256)
image = models.ImageField(upload_to='img/')
brand = models.CharField(max_length=256)
type = models.CharField(choices=ITEM_TYPES, max_length=2)
description = models.TextField(blank=True, null=True)
season = models.TextField(blank=True, null=True)
discount = models.FloatField(blank=True, null=True)
price = models.FloatField()
def __str__(self):
return self.title + ' ' + self.type
def as_dict(self):
data = {"title": self.title, "image": self.image.url, "brand": self.brand, "type": self.type,
"discount": self.discount, "price": self.price, "rus_representation": self.rus_representation,
"description": self.description, "season": self.season, "images": [self.image.url]}
if self.images:
for image in self.images.all():
data['images'].append(image.image.url)
# data['dumped'] = json.dumps(data)
# print(data['dumped'])
return data
def dumped_as_dict(self):
return json.dumps(self.as_dict())
@property
def rus_representation(self):
if self.type == 'UM':
return 'Зонтик'
elif self.type == 'SK':
return 'Юбка'
elif self.type == 'TR':
return 'Штаны'
elif self.type == 'OT':
return 'Другое'
基于类的 View ,其中包含过滤功能:
class ProductsListView(ListView):
model = Item
types = Item.ITEM_TYPES
brands = Item.BRANDS
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['types'] = self.types
context['brands'] = self.brands
return context
@classmethod
def filter_items(cls, request, *args, **kwargs):
if request.is_ajax():
data = request.GET
queryset = Item.objects.all()
if not data['type'] == 'ALL':
queryset = queryset.filter(type=data['type'])
if not data['brand'] == 'ALL':
queryset = queryset.filter(brand__contains=data['brand'])
return JsonResponse({'result': [item.as_dict() for item in queryset]})
JavaScript过滤函数:
$('.choice-link').click(function () {
var choice = $(this).text();
$(this).siblings().attr('id', '');
$(this).attr('id', 'active');
$(this).parent().parent().children('button').text(choice);
var data = {
'brand': $('.brand-dropdown').children('#active').attr('data-choice'),
'type': $('.type-dropdown').children('#active').attr('data-choice')
};
$.ajax({
url: '../ajax/filter/',
data: data,
success: function (data) {
$('.item-block').remove();
$.each(data.result, function (index, item) {
if (!item.discount) {
var el = '<div class="item-block flex" style="flex-direction: column"><input type="hidden" value='+ JSON.stringify(item) +'><img class="img-fluid" style="box-shadow: 0 0 10px rgba(0,0,0,0.5);" src="' + item.image + '"><h6 class="item-title">' + item.rus_representation + ' "' + item.brand + '"<hr></h6><p class="flex" style="align-items: flex-start"><span class="price-tag">' + item.price + ' $</span></p><button type="button" class="item-btn btn-sm btn btn-outline-info" data-toggle="modal" data-target=".details-modal">Подробней <img style="height: 10px" "></button></div>';
} else {
var el = '<div class="item-block flex" style="flex-direction: column"><input type="hidden" value='+ JSON.stringify(item) +'><img class="img-fluid" style="box-shadow: 0 0 10px rgba(0,0,0,0.5);" src="' + item.image + '"><h6 class="item-title">' + item.rus_representation + ' "' + item.brand + '"<hr></h6><p class="flex" style="align-items: flex-start"><span class="price-tag">' + item.price + ' $</span><span class="discount badge badge-danger">' + item.discount + ' $</span></p><button type="button" class="item-btn btn-sm btn btn-outline-info" data-toggle="modal" data-target=".details-modal">Подробней <img style="height: 10px" "></button></div>';
}
$('.items-list').children('hr').after(el)
});
}
})
});
用相关数据填充模态的 Java 脚本函数:
$(document).on('click', '.item-btn', function () {
var data = JSON.parse($(this).siblings('input').val()); (line 54 where error message points)
$('.product-title').html(data.rus_representation + ' "<i>' + data.brand + '</i>"' + '<hr>');
if(data.description) {
$('.product-description').text(data.description);
}else{
$('.product-description').html('<h4>Описнаие пока не добавлено</h4>')
}
$('.carousel-inner').empty();
$.each(data.images, function (index, img) {
if(index === 0){
var el = '<div class="carousel-item active"><img class="d-block w-100" src="'+ img +'"></div>'
} else {
var el = '<div class="carousel-item"><img class="d-block w-100" src="'+ img +'"></div>'
}
$('.carousel-inner').append(el)
});
$('.product-brand').html('<i>' + data.brand + '</i>');
$('.product-type').text(data.rus_representation);
$('.product-season').text(data.season);
if (data.discount){
$('.discount-in-modal').html('<span class="discount badge badge-danger" style="position: relative; top: -5px">'+ data.discount +' $</span>');
}
$('.product-price').text(data.price);
});
HTML:
{% for item in object_list %}
<div class="item-block flex" style="flex-direction: column">
<input type="hidden" value="{{ item.dumped_as_dict }}">
<img class="img-fluid" style="box-shadow: 0 0 10px rgba(0,0,0,0.5); max-height: 300px" src="{{ item.image.url }}">
<h6 class="item-title">
{{item.rus_representation}} "{{item.brand}}"
<hr>
</h6>
<p class="flex" style="align-items: flex-start">
<span class="price-tag">{{ item.price }} $</span>
{% if item.discount %}
<span class="discount badge badge-danger">{{ item.discount }} $</span>
{% endif %}
</p>
<button type="button" class="item-btn btn-sm btn btn-outline-info" data-toggle="modal" data-target=".details-modal">Подробней <img style="height: 10px" src="{% static 'img/arrow.png' %}"></button>
</div>
{% endfor %}
IF do console.log(JSON.stringify(item));
:
{"title":"tst","image":"/media/img/_58A1259_sm.jpg","brand":"GUCCI","type":"SK","discount":9000000,"price":9,"rus_representation":"Юбка","description":"LoL Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.","season":"","images":["/media/img/_58A1259_sm.jpg","/media/img/_58A7975_sm.jpg"]}
它应该是什么样子:
opening the modal on initial load
我有:
if use filtering and them trying to open details modal
从检查器添加 View : For some reasons string is not fully added to value
attr
最佳答案
当您构建该 HTML 字符串时,您的代码会执行如下操作:
var el = '<div ... value=' + JSON.stringify(x) + ' ... >';
HTML 结果将是
var el = '<div ... value={ ... } ... >';
由于“value”的属性值在生成的 HTML 源中未加引号,因此对于 HTML 解析器而言,JSON 中的第一个空格字符是属性值的结尾。
您至少需要包含引号:
var el = '<div ... value=\'' + JSON.stringify(x) + '\' ... >';
我还强烈建议您使用 HTML 实体编码器对字符串中的任何 HTML 元字符进行编码,例如
function scrubHtml(s) {
return s.replace(/[<>'"&]/g, function(meta) {
return "&#" + meta.charCodeAt(0) + ";";
});
}
关于javascript - 未捕获的 SyntaxError : Unexpected end of JSON input. 无法正确地将 html 中的信息解析为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53970986/
我有两个文本输入元素 A 和 B。 我希望用户能够从 A 中选择部分或全部文本并拖动到 B,但文本不会从 A 中消失。 假设“A”包含“quick brown fox”,用户突出显示“fox”一词并将
我正在一个网站上工作,如果在提交表单之前数字不在最小值和最大值之间,我希望数字输入能够自行更正。我的代码如下: HTML: JavaScript: function CorrectOverUnder
在检查输入值是否存在并将其分配给变量时,我看到了两种实现此目的的方法: if(Input::has('id')) { $id = Input::get('id'); // do som
我意识到 有一个 border-box盒子模型,而有一个 content-box盒子模型。此行为存在于 IE8 和 FF 中。不幸的是,这使我无法将这种样式应用于大小均匀的输入: input, tex
在 Polymer 文档 ( https://elements.polymer-project.org/elements/iron-input ) 中,我发现: 而在另一个官方文档(https://
我使用 jquery 添加/删除输入 我使用append为日期/收入添加多个Tr 我还使用另一个附加来添加多个 td 以获取同一日期 Tr 中的收入 我添加多个日期输入,并在此表中添加多个收入输入 我
Python3 的 input() 似乎在两次调用 input() 之间采用旧的 std 输入。有没有办法忽略旧输入,只接受新输入(在 input() 被调用之后)? import time a =
在一些教程中,我看到了这些选择器: $(':input'); 或 $('input'); 注意“:”。 有什么不同吗? 最佳答案 $('input') = 仅包含元素名称,仅选择 HTML 元素。 $
我有下一个 html 表单: Nombre: El nombre es obligatorio. Solo se pe
有两种方法可以在组件上定义输入: @Component({ inputs: ['displayEntriesCount'], ... }) export class MyTable i
input: dynamic input is missing dimensions in profile onnx2trt代码报错: import numpy as np import tensor
所以,我有允许两个输入的代码: a, b = input("Enter a command: ").split() if(a == 'hello'): print("Hi") elif(a =
我有一个与用户交流的程序。我正在使用 input() 从用户那里获取数据,但是,我想告诉用户,例如,如果用户输入脏话,我想打印 You are swearing!立即删除它! 而 用户正在输入。 如您
我在运行 J2ME 应用程序时遇到了一些严重的内存问题。 所以我建立了另一个步骤来清除巨大的输入字符串并处理它的数据并清除它。但直到我设置 input = null 而不是 input = "" 才解
我想在我的 android 虚拟设备中同时启用软输入和硬键盘。我知道如何两者兼得,但不会两者。 同时想要BOTH的原因: 软输入:预览当键盘缩小屏幕时布局如何调整大小 硬键盘:显然是快速输入。 提前致
我有一个邮政编码字段,在 keyup 上我执行了一个 ajax 调用。如果没有可用的邮政编码,那么我想添加类“input-invalid”。但问题是,在我单击输入字段的外部 某处之前,红色边框验证不会
根据我的理解使用 @Input() name: string; 并在组件装饰器中使用输入数组,如下所示 @Component({ ... inputs:
我有一段代码是这样的 @Component({ selector: 'control-messages', inputs: ['controlName: control'],
在@component中, @input 和@output 属性代表什么以及它们的用途是什么? 什么是指令,为什么我们必须把指令放在下面的结构中? directives:[CORE_DIRECTIVE
有没有一种方法可以测试变量是否会使SAS中的INPUT转换过程失败?或者,是否可以避免生成的“NOTE:无效参数”消息? data _null_; format test2 date9.; inp
我是一名优秀的程序员,十分优秀!