在 Backbone 视图中使用 jQuery 设置 contenteditable 样式
Styling contenteditable with jQuery within a Backbone view
我正在创建一个 基本应用程序来学习 Backbone.js。在我的代码中,我有以下模板。
<script type="text/template" id="userTemplate">
<span class="nome"><%= nome %></span>
<span class="sobrenome"><%= sobrenome %></span>
<a href="#" class="editar">Editar</a>
<a href="#" class="remover">Remover</a>
</script>
.editar
单击事件处理程序:
editar: function(ev) {
ev.preventDefault();
var style = {
color: 'green',
height: '70px',
border: '2px solid green'
};
$('.sobrenome').attr('contenteditable', true).focus();
$('.sobrenome').css(style);
},
我一直在尝试使用 jQuery 的 css()
来设置 contenteditable
的样式,但由于某些原因,css 不适用于内容。
this.$('.sobrenome').attr('contenteditable', true).css(style).focus();
怎么了?在我看来,一切都还好。
问题好像出在这部分:
this.$('.sobrenome')
我不相信你可以将原生 this
与 jQuery 选择器结合起来,你需要将 this
变成 jQuery 可以使用的东西,所以尝试以下...
$(this).$('.sobrenome')
但是,即使进行这种更改也没有意义,因为您没有在 JavaScript 中与 .
连接。像这样链接选择器不会做太多事情。
这是你的目标吗?我将样式放在 class 中并删除了不必要的(?)this
$('.sobrenome').attr('contenteditable', true).focus();
.sobrenome{
color: green;
height:70px;
border:2px solid green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="sobrenome">asasf</div>
var style = {
color: 'green',
height:'70px',
border: '2px solid green'
};
$('.sobrenome').each(function() {
var _state = $(this).attr('data-contenteditable');
if (_state === 'true') {
$(this).css(style).focus();
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="sobrenome" data-contenteditable="false">Unstyled element</div>
<div class="sobrenome" data-contenteditable="true">Sstyled element</div>
既然您使用的是 Backbone,我想我会提供一个简单的 Backbone 视图,它可以切换 contenteditable
属性并且默认使用 CSS 进行风格化.
避免将 CSS 与 JavaScript 一起应用,只要有可能,更喜欢切换 类 以保持样式和逻辑完全分离。
要仅在 contenteditable
为真时对某些内容进行样式化,您可以使用以下选择器。
[contenteditable="true"] {
/* css */
}
为了示例的缘故,我简化了代码。我添加了一个简单的 blur
处理程序以在用户单击元素外部时删除 contenteditable
。
var ContentEditableView = Backbone.View.extend({
template: _.template($('#userTemplate').html()),
events: {
"click .edit": 'onEdit',
"blur .content": 'onEditDone'
},
render: function() {
this.$el.html(this.template({
content: "test",
nome: "test nome",
}));
// caching jQuery object is better than querying the DOM each time.
this.$content = this.$('.content');
return this;
},
onEdit: function(e) {
e.preventDefault();
this.$content.attr('contenteditable', true).focus();
},
onEditDone: function() {
this.$content.attr('contenteditable', false);
}
});
var view = new ContentEditableView({
el: $('#app')
});
view.render();
/* keep CSS out of the JS */
[contenteditable="true"] {
color: green;
height: 70px;
border: 2px solid green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
<div id="app"></div>
<script type="text/template" id="userTemplate">
<span class="content"><%= content %></span>
<a href="#" class="edit">Edit</a>
</script>
我正在创建一个 基本应用程序来学习 Backbone.js。在我的代码中,我有以下模板。
<script type="text/template" id="userTemplate">
<span class="nome"><%= nome %></span>
<span class="sobrenome"><%= sobrenome %></span>
<a href="#" class="editar">Editar</a>
<a href="#" class="remover">Remover</a>
</script>
.editar
单击事件处理程序:
editar: function(ev) {
ev.preventDefault();
var style = {
color: 'green',
height: '70px',
border: '2px solid green'
};
$('.sobrenome').attr('contenteditable', true).focus();
$('.sobrenome').css(style);
},
我一直在尝试使用 jQuery 的 css()
来设置 contenteditable
的样式,但由于某些原因,css 不适用于内容。
this.$('.sobrenome').attr('contenteditable', true).css(style).focus();
怎么了?在我看来,一切都还好。
问题好像出在这部分:
this.$('.sobrenome')
我不相信你可以将原生 this
与 jQuery 选择器结合起来,你需要将 this
变成 jQuery 可以使用的东西,所以尝试以下...
$(this).$('.sobrenome')
但是,即使进行这种更改也没有意义,因为您没有在 JavaScript 中与 .
连接。像这样链接选择器不会做太多事情。
这是你的目标吗?我将样式放在 class 中并删除了不必要的(?)this
$('.sobrenome').attr('contenteditable', true).focus();
.sobrenome{
color: green;
height:70px;
border:2px solid green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="sobrenome">asasf</div>
var style = {
color: 'green',
height:'70px',
border: '2px solid green'
};
$('.sobrenome').each(function() {
var _state = $(this).attr('data-contenteditable');
if (_state === 'true') {
$(this).css(style).focus();
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="sobrenome" data-contenteditable="false">Unstyled element</div>
<div class="sobrenome" data-contenteditable="true">Sstyled element</div>
既然您使用的是 Backbone,我想我会提供一个简单的 Backbone 视图,它可以切换 contenteditable
属性并且默认使用 CSS 进行风格化.
避免将 CSS 与 JavaScript 一起应用,只要有可能,更喜欢切换 类 以保持样式和逻辑完全分离。
要仅在 contenteditable
为真时对某些内容进行样式化,您可以使用以下选择器。
[contenteditable="true"] {
/* css */
}
为了示例的缘故,我简化了代码。我添加了一个简单的 blur
处理程序以在用户单击元素外部时删除 contenteditable
。
var ContentEditableView = Backbone.View.extend({
template: _.template($('#userTemplate').html()),
events: {
"click .edit": 'onEdit',
"blur .content": 'onEditDone'
},
render: function() {
this.$el.html(this.template({
content: "test",
nome: "test nome",
}));
// caching jQuery object is better than querying the DOM each time.
this.$content = this.$('.content');
return this;
},
onEdit: function(e) {
e.preventDefault();
this.$content.attr('contenteditable', true).focus();
},
onEditDone: function() {
this.$content.attr('contenteditable', false);
}
});
var view = new ContentEditableView({
el: $('#app')
});
view.render();
/* keep CSS out of the JS */
[contenteditable="true"] {
color: green;
height: 70px;
border: 2px solid green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
<div id="app"></div>
<script type="text/template" id="userTemplate">
<span class="content"><%= content %></span>
<a href="#" class="edit">Edit</a>
</script>