Enable div to scroll by keyboard without clicking - scroll

I have div element in which I am loading text, usually long text, so the div has scrollbars. I can scroll in this div with mouse, when the cursor is on it, but I cant scroll with page up and down, unless I click inside the div first. So Is there a way to avoid this clicking, to do it from code when the text is loaded?

The answer here worked for me:
Set keyboard focus to a <div>
Basically add a tabindex to the div:
<div id="mydiv" tabindex="-1">
then programmatically set the focus using:
document.getElementById("mydiv").focus();
From the original post:
The tabindex value can allow for some interesting behaviour.
If given a value of "-1", the element can't be tabbed to but focus can
be given to the element programmatically (using element.focus()).
If given a value of 0, the element can be focused via the keyboard and
falls into the tabbing flow of the document.
Values greater than 0
create a priority level with 1 being the most important.

Here it is, as you described. I appended an input to the content div, then focus() it, rather than trying to focus the div. So, immediately after pressing load text, you can press pg up/dn to scroll div.
HERE IT IS
$("div").append('<input type="text" id="focusDiv">');
/*
Here I need to have some code which gives "focus to the div, so if I press the load text and then immediately PageDown key, sthedvis scrolls down.
$("button").on("click", function (e) {
e.preventDefault();
$("div").html("Very long text...");
$("div").append('<input type="text" id="focusDiv">');
$('#focusDiv').focus();
});

Related

Show CKEditor5 Balloon toolbar programatically on right click?

I use CkEditor BalloonEditor:
BalloonEditor.create(document.querySelector('#editor'), { ...options... });
By design the balloon toolbar of CkEditor 5 is only shown when I mark some text in the editor. That's totally okay for standard text operations as making a text bold, italic or changing its colors.
But if I want to insert something (image, table, media) I first must type something, mark it, so that the toolbar is shown before I can insert new content. That is not practical. So actually the balloon editor is great for changing existing content, not to insert new content.
My idea now is, that I want to open the toolbar by clicking with the right mouse button, showing the toolbar instead of the browser's context menu. Nice would be if the toolbar then only contains actions to insert new content (as inserting image, table, media) and the actions for formatting content (as bold, italic, font color) disappears or at least are disabled.
So basically I would implement something like:
<div id="editor" oncontextmenu="showContextMenu(event)">
...
function showContextMenu(event) {
event.preventDefault();
// --> Open here the balloon toolbar at the current caret position. How?
}
I tried finding a solution with a hack:
When clicking with the right mouse button, I inserted a space character at the clicked position and marked/selected it automatically so that the CkEditor balloon editor opened the toolbar. That worked so far, but then I had this undesired space character in the document and I struggled to remove it gracefully afterwards. Furthermore the context menu also contained the text formatting actions (as bold, italic and so on, since there was text - the inserted space selected).
Another idea would be to develop an own toolbar completely detached from CkEditor and then using Commands to insert the appropriate commands as #denov has suggested in his solution. But I think this should actually be possible to achieve with the CkEditor API by using the class ContextualBalloon. But how?
Does anyone have any idea how to achieve this or can guide me with some directions?
Thx!
For images you can just drag the image into the editor.
Commands are the way to interact with the editor. The Images plugin uses the ImageInsertCommand
assuming you have the editor assigned to the global window object you could do
function showContextMenu(event) {
event.preventDefault();
window.editor.execute('imageInsert', { source: 'https://upload.wikimedia.org/wikipedia/commons/8/8d/Frog_on_palm_frond.jpg'} )
}
Unfortunately, it's not possible to show the balloon toolbar if the selection is collapsed. This behaviour is defined here.

Add event listener when a `<div>` tag changes size on screen

There's a collapsible sidebar on my webpage. When I collapse it, I want the svg element on the page to resize to take up all of the new blank space.
The function that resizes the svg is working. However, it is not being triggered when the sidebar is collapsed.
I have tried:
d3.select("#mydivHoldingSVG").on("resize", MyResize)
Where #mydivHoldingSVG is a <div> and MyResize is the function to resize the svg.
When the sidebar is collapsed, the <div> element increases in size (as inspected via Google Chrome developer view), which I thought constituted a "resize".
If the window is resized, that is, if I use:
d3.select(window).on("resize", MyResize)
Then the svg resizes correctly.
I have looked at the list of standard events to see if one can be applied to the div element (#mydivHoldingSVG) but I'm not seeing an obvious "when a div element changes" event.
Is there an eventListener that can be added on a <div> element being resized or changed?
The gist is that you should do it another way: the resize event only pertains to the window and will not fire on any other element.
The cleanest way to solve this problem would be call MyResize when you call whatever function is collapsing your sidebar, rather than trying to indirectly listen for the sidebar being collapsed.

How to click at a certain location in div

I want to execute a click on a full-screen div which is underneath a (non full-screen) modal dialog. However it seems that the click event automatically targets the center of my background div, thereby touching content that's on top of that div (the modal dialog itself).
How can I specify where the click should happen?
This is the verbose output of my click command:
Element is not clickable at point (640, 436). Other element would receive the click: <label class="btn btn-default ">...
The root of problem is selenium clicks by sending mouseclick event not directly to the element but by screen coordinates. Therefore it cannot find clickable element by point (as described in verbose output).
There are two possible workaround (for your case):
1) Click by element position which not overlapped by modal dialog (applicaple for fullscreen div):
.moveToElement('.backdrop', 900, 10) // 900 is X offset
.mouseButtonClick(0)
2) Better, universal solution. By directily sending click event via injected javascript:
.execute(function(selector) {
document.querySelector(selector).click();
}, ['.backdrop'])

Show Telerik RadWindow from Server while maintaining scroll position

When displaying a RadWindow while scrolled to the bottom of the page, the window is rendered at the top the of the page and I have to scroll back up to see the window.
I'm maintaining post back scroll position by setting 'MaintainScrollPositionOnPostback':
<%# Page Language="C#" MaintainScrollPositionOnPostback="true" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
I have a RadListView where the ItemTemplate has a button in it. When that button is clicked, I display a RadWindow modal.
The problem is if I scroll to the bottom of the page and click the button, the page displays the window at the top of the page, but then scrolls back down to where user was scrolled at (due to MaintainScrollPositionOnPostback). So the window is displayed off screen until user scrolls back up
How can I show the RadWindow where the user is scrolled at on postback? (Not at top of page)
I've tried displaying RadWindow 2 different ways but both have same result
Way 1:
Window.VisibleOnPageLoad = true;
Way 2:
string script = "function f(){$find(\"" + RadWindow1.ClientID + "\").show(); Sys.Application.remove_load(f);}Sys.Application.add_load(f);";
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "key", script, true);
Add a timeout around show() to let the scrolling take place before you open the RadWindow. Otherwise, here is what happens:
postback returns, page is not scrolled
RadWindow shows up, centers in the current viewport
scrolling shifts so your RadWindow is not where you expect it
Here is an example:
string script = "function f(){setTimeout(function(){$find(\"" + RadWindow1.ClientID + "\").show(); },111);Sys.Application.remove_load(f);}Sys.Application.add_load(f);";
where you can tweak the 111ms timeout I added for illustrative purposes. Using 0 as an argument may also suffice. To be honest, I don't know how long it takes for the scroll to shift.
By the way, I would create a JS function in the markup that would take the ID of the RadWIndow as an argument and call that instead, just to make the code more readable

jquery layout and dynamic draggable div issue

I am using jquery layout plugin and have the following situation that I cannot find a solution. How do I make the center pane increase its size permanently by dragging the div beyond the bottom border.
I have a left pane and a center pane. I dynamically generate div
when the user clicks on the left pane. The divs are generated and
dropped on the center pane. The divs are draggable and resizable.
Everything works fine with dragging and resizing on the visible center
area. The moment I drag the div beyond the bottom, the scroll bar on
the center pane appears and it seems the center pane is extending to
accommodate the new position of the dragged div. But the moment I try
to resize the div or add another div, it jumps to the top section of
the div and resets the scrollbars. I checked the center div height in
firebug and it remains at the same height when initialized
even after dragging the new div beyond the bottom.
Here is the test page html code.
Just copy/paste entirely into a html page. On the left pane, click on the "Add new" button will add new div that is draggable and resizable.
Click on "Add new"
Drag the newly added div beyond the bottom of the center pane.
The center pane shows the scrollbar as it is suppose to.
If you check the center div's height in firebug, it is not changing
Now try resizing the newly added div by dragging its handle
It jumps to the top and the center box loses its scrollbar.
I could not paste the complete html page so here is the reference to the code at the bottom of this thread
http://groups.google.com/group/jquery-ui-layout/browse_thread/thread/ca922aa44c0048ee
And here is the test link http://jsfiddle.net/yZc63/
I am surprised no one has come across this situation before? Even without the layout plugin, my solution is not very pretty. In order to simulate the page without the layout plugin, I had to keep the top and the left pane using position:fixed property in css. And there is no center div at all. I add the new div directly to the body of the html. The reason is I don't want to see additional scrollbars on top the browser scrollbars. In other words the center pane should scroll when the browser scrollbars are moved. I am attaching the solution so you have an idea.
I am open to any solution even without the layout plugin if i can simulate the previous attached file using any other approach. i am attaching my page without the layout plugin but am not sure if that is the only elegant solution left.
You can check the solution here http://jsfiddle.net/c7wrT/
Is adding the dynamic div directly to the html body a good approach?
I ran into same situation and this answer helped.
https://stackoverflow.com/a/33004821/2139859. Updated Fiddle: http://jsfiddle.net/bababalcksheep/yZc63/11/
$(".removalbe-recom").draggable({
appendTo: "body",
helper: "clone",
revert: "invalid",
cursor: "move",
containment: "document",
zIndex: 10000,
scroll:false,
start: function (event, ui) {
$(this).hide();
},
stop: function (event, ui) {
$(this).show();
}
});

Resources