我有一个困境:我想用事件监听器发送一些数据,但也能够删除监听器.这是标准的封闭方法......
var fn = function(e){method(e,data)};
el.addEventListener('click',fn,false);
el.removeEventListener('click',fn,false);
Run Code Online (Sandbox Code Playgroud)
你可以删除这个事件,就好了.但是说,该元素已从DOM中删除?然后,你将被留下来的fn功能.删除几千个DOM元素后,会导致内存泄漏.
我已经考虑过附加一个DOMNodeRemoved事件处理程序,它会删除任何遗留的函数/数据以及被删除的节点.但显然,该事件不是跨浏览器兼容的.
我提出的唯一其他选择是修改元素的DOM.考虑...
el.MyEventData = function(e){method(e,data)};
el.addEventListener('click',el.MyEventData,false);
el.removeEventListener('click',el.MyEventData,false);
Run Code Online (Sandbox Code Playgroud)
在这种情况下修改DOM是否可接受?当您尝试添加多个事件侦听器时,该解决方案的唯一粘性部分.假设我们制作了一个自定义函数来解析事件的添加/删除......
function makeEvent(fn,data){
var dataFn = function(e){fn(e,data)};
//create object to hold all added events
el.myEvents = {};
//make ID for this specific event
var eventID = ranString();
//add the event to the events object
el.myEvents[eventID] = [fn,dataFn];
//finally add the listener
el.addEventListener('click',dataFn,false);
}
function destroyEvent(fn){
//find all fn references
for(var id in el.myEvents){
if (el.myEvents[id][0] == fn){
el.removeEventListener('click',el.myEvents[id][1],false);
el.myEvents[id] = null;
}
} …Run Code Online (Sandbox Code Playgroud) 我正在从关联数组中构建一个树状数据结构.每个键为1-2个字符.钥匙是各自级别的独特之处.根级别上的密钥不超过40个,并且树的每个后续级别上的密钥不超过5个.它可能看起来像这样:
{a:{b:null,c:null},de:{f:{g:null}},h:null,i:null,j:null,k:null}
最初,我认为创建这么多具有如此少的键(平均<3)的对象将是低效且内存密集的.在这种情况下,我会像这样实现自己的哈希表:
//Suppose keys is a multi-dimensional array [[key,data],...]
var hash = function(keys){
var max = keys.length*3, tbl = [];
//Get key hash value
var code = function(key){
return (key.charCodeAt(0)*31)%max;
}
//Get key values
this.get(key){
//2 character keys actually have a separate hash generation algorithm...
//we'll ignore them for now
var map = code(key), i=map;
//Find the key value
while(true){
if (typeof tbl[i] == 'undefined') return false;
if (code(tbl[i][0]) == map && tbl[i][0] == key) return tbl[i][1];
else i …Run Code Online (Sandbox Code Playgroud) 首先,我作为网站程序员来到Java.在JavaScript中,您只需调用addEventListener函数即可添加mousemove,mouseover或click事件.根据我对Java的有限经验,您不能只从任何对象实现MouseListener接口.
基本上,到目前为止我所拥有的是一个JPanel,它绘制了一些具有x/y/width/height值的形状(带有绘制方法的CustomShape对象).我想在形状对象中添加一些类型的鼠标监听器,这样我就可以触发形状的移动/滚动/点击事件.只是将ButtonListener接口实现到CustomShape对象不起作用(我认为这是显而易见的原因).我已经查找了如何设计自定义事件监听器,但似乎并不是可以创建自定义鼠标监听器.
我最终使用鼠标监听器添加到JPanel,然后循环遍历所有形状对象.如果形状对象附加了"侦听器",并且鼠标坐标已验证鼠标事件已发生,则会触发该方法.最初,它很好,但随着应用程序越来越发达,它开始变得非常混乱.另外,如果不复制一堆代码,我将永远无法将形状对象/接口复制到另一个应用程序.
作为一个简单的说明:(实际代码非常大)
Interface CustomShape{
int width, height, x, y;
void paint(Graphics g);
}
public class StarShape implements CustomShape{
int width, height, x, y;
public StarShape(){
width = 100;
height = 100;
x = 50;
y = 50;
}
void paint(Graphics g){
g.setColor(Color.black);
g.draw(new Rectangle(x,y,width,height));
}
}
public class Main extends JPanel{
StarShape check = new StarShape();
public Main(){ }
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
check.paint(g);
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我想知道是否有一种干净的方式来实现某种类型的鼠标监听器的"手绘"形状.
我想知道是否有人知道如何将像素宽度填充或边距合并到流体柱设计中,而无需额外的html标记.
为了进一步说明,请考虑一个简单的html/css布局,如下所示:
<style>
.cont{width:500px;height:200px;border:1px solid black;}
.col{float:left;}
#foo{background-color:blue;width:10%;}
#bar{background-color:yellow;width:30%;}
#baz{background-color:red;width:60%;}
</style>
<div class="cont">
<div class="col" id="foo">Foo</div>
<div class="col" id="bar">Bar</div>
<div class="col" id="baz">Baz</div>
</div>
Run Code Online (Sandbox Code Playgroud)
这显示正确(忽略可以处理的杂项css显示错误).但是,一旦你向col类中添加10px填充,浮动不再显示为内联.如果你想在col课堂上放一个3px的边框,情况也一样.我已经看过css技术,人们将使用负边距来反转从盒子模型创建的添加像素,但它仍然不会减小<div>宽度.所以基本上,我想要的是一种技术,可以让我保持10%的宽度,但10%的10%是填充(或边距或不是).
这是一个对象:
var obj = new function(){
this.prop = {};
}
Run Code Online (Sandbox Code Playgroud)
我尝试做类似的事情:
obj.prop.prototype["new_attr"] = "some_value";
我想做的是永久修改obj.prop以包含新属性.根据我的理解,所有"对象"都有原型,但JavaScript告诉我prop没有原型.
也许我采取了错误的方法(试图永久修改prop),但我至少想知道为什么上面的代码不起作用.
我在C中声明了一个多维数组,如下所示:
int arr[4][2];
int length = 0;
Run Code Online (Sandbox Code Playgroud)
但我显然可以添加尽可能多的元素:
void addStuff(){
arr[length][0] = someVal;
arr[length++][1] = someVal;
}
Run Code Online (Sandbox Code Playgroud)
并且它不会给出任何错误.这是否意味着我在无人区的某处腐蚀了我的记忆?或者这个CI的某些功能不知道?
我制作的JavaScript函数需要解析所有不一定附加"one"值的CSS值.例如,margin:0 0 4px 12px;实际上是四个值(margin-top,margin-right等).
基本上,我只需要一个速记属性列表.但是,我不需要所有速记css.我只需要可能是动画的速记css(rgb,px,em等).所以,我不关心,border:1px solid black;因为我不能动画solid.但是我关心,border-width,因为border-width是所有四个边框的简写.
无论如何,我的列表包括:
- border-width
- background-position
- padding
- margin
- border-radius - box-shadow
- outline-radius
- border-color
- border-colors - text-shadow - font
那么,我有没有想念?你看,我不知道是否有任何模糊的属性是这样的:mystery-color:red green blue hazel pigbreath;
我想有一个动态字符数组,其长度等于循环迭代.
char* output;
for (short i=0; i<2; i++){
output = new char[i+1];
printf("string length: %d\n",strlen(output));
delete[] output;
}
Run Code Online (Sandbox Code Playgroud)
但是strlen返回16,我希望它是1和2.